Wiele osób nie zdaje sobie sprawy, jak dużo różnych query parserów dostępny jest w Solr. W dzisiejszym wpisie chciałbym przybliżyć wszystkim czytelnikom listę dostępnych parserów i krótko wspomnieć co każdy z nich oferuje.
Zacznijmy od listy
Korzystając z parameteru defType w trakcie zapytania jesteśmy w stanie określić, który query parser zostanie wykorzystany w trakcie przetwarzania naszego zapytania. Lista dostępnych query parserów w Solr 4.4 przedstawia się następująco:
- lucene
- lucenePlusSort
- func
- prefix
- boost
- dismax
- edismax
- field
- raw
- term
- query
- frange
- geofilt
- bbox
- join
- surround
- switch
- maxscore
Przejdźmy zatem do ich opisu.
Lucene Query Parser – lucene
Domyślny parser wykorzystywany przez Solr umożliwiający zadawanie zapytań z wykorzystaniem języka zapytań Lucene (z pewnymi, małymi zmianami o których można przeczytać tutaj: http://wiki.apache.org/solr/SolrQuerySyntax). Przykładowe zapytanie z wykorzystaniem tego parsera wygląda następująco: q=+title:harry +category:books
Old Lucene Query Parser – lucenePlusSort
Stary parser Lucene, który wydaje się być bardzo rzadko wykorzystywany. Wyróżniał się tym, iż pozwalał na określenie sortowania w samym zapytaniu (metoda ta oznaczona jest jako deprecated). Zapytanie takie wyglądało następująco: q={!lucenePlusSort}title:harry;price asc
Function Query Parser – func
Parser umożliwiający wykorzystanie funkcji (http://wiki.apache.org/solr/FunctionQuery) w zapytaniu. Na przykład, można go wykorzystać do wykonywania obliczeń na etapie zapytań: q={!func}add($value1,$value2)&value1=max(price,100)&value2=1.0.
Prefix Query Parser – prefix
Jeden z parserów, którego nie interesuje typ pola – wartości do niego podane nie będą poddane analizie. Sam parser służy do wykonywania zapytań z wykorzystaniem przedrostków, na przykład zapytanie, takie jak q={!prefix}har jest prawie tym samym co zapytanie q=har* wykorzystujący domyślny Lucene query parser.
Boost Query Parser – boost
Parser umożliwiający tworzenie zapytań modyfikujących wartości score dokumentów. Na przykład, jeżeli chcemy, aby score dokumentów zwracanych w odpowiedzi na zapytanie harry były zmodyfikowane zapytaniem recip(ms(NOW,published),3.16e-11,1,1), możemy zadać następujące zapytanie: {!boost b=recip(ms(NOW,published),3.16e-11,1,1)}harry.
Dismax Query Parser – dismax
Parser obsługujący uproszczoną wersję języka zapytań Lucene (np. nie ma możliwości przekazania nazwy pola w zapytaniu), który na wyjściu tworzy tzw. zapytania disjunction max (wiem, wiem, dziwnie to brzmi) stworzone z przekazanego zapytania oraz pól zdefiniowanych w parametrze qf. Pozwala na definiowanie liczby słów, jakie muszą być znalezione w dokumencie (za pomocą parametru mm) oraz definicji, jak powinny być traktowane poszczególne elementy wpływające na finalny score dokumentu (parametr tie). Wszystkie parametery udostępnianie przez ten parser oraz jego opis można znaleźć na wiki Solr, pod adresem: http://wiki.apache.org/solr/DisMaxQParserPlugin.
Extended Dismax Query Parser – edismax
Rozszerzona wersja parsera dismax, umożliwiająca między innymi podawanie nazw pól w głównym zapytaniu. Parser ten, został zaprojektowany z myślą o możliwości podawania bardziej skomplikowanych zapytań, niż te, które można było przekazać za pomocą parametru q w przypadku parsera dismax. Wszystkie parametry i dokładniejszy opis parsera można znaleźć na wiki Solr pod adresem: http://wiki.apache.org/solr/ExtendedDisMax.
Field Query Parser – field
Field query parser umożliwia nam wykonywanie zapytań przeciwko danemu polu. Przekazana do parsera wartość zostanie poddana analizie oraz zostanie stworzone zapytanie o frazę, jeżeli jest taka możliwość. Na przykład, zapytanie postaci {!field f=title}harry potter jest mniej, więcej odpowiednikiem zapytania title:”harry potter” w przypadku korzystania z domyślnego Lucene query parsera.
Raw Query Parser – raw
Parser umożliwiający przekazanie terma, który nie zostanie poddany analizie przez Solr. Na przykład zapytanie {!raw f=title}harry zaowocuje stworzeniem TermQuery do pola title z wartością harry.
Term Query Parser – term
Parser przydatny do zadawania zapytań, które powinny zostać potraktowane jako filtry, np. w przypadku zawężania facetingu – {!term f=category}book. Należy pamiętać, iż wartość przekazana do tego parsera nie zostanie poddana analizie.
Nested Query Parser – query
Parser umożliwiający przekazanie podzapytania, z możliwością zmiany typu podzapytania. Na przykład weźmy następujące zapytanie {!query defType=func v=$query}&$query=max(price,100) będzie ono skutkować wywołaniem zapytania z wykorzystaniem funkcji zdefiniowanego w parametrze query. Jeżeli natomiast zmienimy parametr query na następujący: $query={!term f=category}book, wtedy zostanie wykonane zapytanie z wykorzystaniem term query parsera, a zatem parametr defType zostanie nadpisany. Nested query parser jest użyteczny na przykład w sytuacji, kiedy chcemy umożliwić użytkownikom wykorzystanie wartości zapisanych w parametrach konfiguracyjnych.
Function Range Query Parser – frange
Parser umożliwiający zadanie zapytanie o zakres wartości wyniku działania funkcji (pisaliśmy o tym – http://solr.pl/2011/05/30/krotkie-spojrzenie-frange/). Parser umożliwia wykorzystanie czterech parametrów: l, u, incl, incu które pozwalają na konfigurowanie jego zachowania. Przykładowe zapytanie z wykorzystaniem tego parsera może wyglądać następująco: {!frange l=10 u=12 incl=true incu=true}sum(price,rate).
Spatial Filter Query Parser – geofilt
Jeden z dwóch parserów umożliwiających zawężanie dokumentów na podstawie ich lokalizacji oraz odległości od podanego punktu geograficznego. Na przykład zapytanie q=*:*&fq={!geofilt pt=52.14,21.10 sfield=location d=50} zwróci nam dokumenty, które zawierają się w odległości 50km od podanego punktu. Więcej o tym parserze można przeczytać na wiki Solr pod adresem: http://wiki.apache.org/solr/SpatialSearch#geofilt_-_The_distance_filter.
Spatial Box Query Parser – bbox
Kolejny query parser umożliwiający zawężanie dokumentów na podstawie ich lokalizacji. W odróżnieniu od parsera geofilt parser bbox jest mniej wymagający pod względem mocy obliczeniowej, aczkolwiek może zwrócić dokument, który będzie znajdował się poza dokładnie zdefiniowanym okręgiem (ze względu na przybliżenia obliczeń). Przykładowe zapytanie wykorzystujące ten parser może wyglądać następująco: q=*:*&fq={!bbox pt=52.14,21.10 sfield=location d=50}. Więcej o tym parserze można przeczytać na wiki Solr pod adresem http://wiki.apache.org/solr/SpatialSearch#bbox_-_Bounding-box_filter.
Join Query Parser – join
Parser umożliwiający tworzenie zapytań o dokumenty, które są zależne od innych dokumentów, czyli z wykorzystaniem joinów. Możliwe są połączenia zarówno w ramach pojedynczego rdzenia, jak i różnych rdzeni. Przykładowe zapytanie może wyglądać następująco: q={!join from=parent to=id}color:Yellow. Więcej przykładów oraz trochę dokładniejszy opis można znaleźć wśród wcześniejszych artykułów, np. tutaj: http://solr.pl/2011/02/21/czekajac-na-4-0-solr-2272-czyli-solr-i-funkcjonlanosc-join/.
Surround Query Parser – surround
Parser, który jest dostępny w ramach dodatkowych bibliotek do Solr (można o nim przeczytać więcej na: http://wiki.apache.org/solr/SurroundQueryParser). Postaramy się w nabliższych tygodniach napisać o nim więcej – generalne pozwala na wyszukiwanie informacji z uwzględnieniem pozycji.
Switch Query Parser – switch
Idea działania tego parsera jest dość prosta – umożliwić przetwarzanie prostego warunku po stronie Solr i przekazanie go jako podzapytania. Przykład wykorzystania oraz więcej o tym parserze można znaleźć tutaj: http://solr.pl/2013/06/03/switch-query-parser-szybkie-spojrzenie/.
Max Score Query Parser – maxscore
Bardzo podobny (jeżeli chodzi o parametry) parser do domyślnego Lucene query parsera. Różnica w działaniu polega na wyliczaniu score dokumentów. W przypadku max score query parsera, dokumenty otrzymują score równy najbardziej znaczącemu elementowi w zapytaniu. Dodatkowo, mamy możliwość zmiany tego zachowania poprzez przekazanie parametru tie (domyślnie 0.0). W przypadku przekazania tie=0.0, dokument otrzyma score, taki jak najbardziej znaczący element zapytania, jeżeli przekażemy tie=1.0, to score dokumentu będzie sumą wszystkich elementów wpływających na score. Przykładowe zapytanie może wyglądać następująco: q=potter {!maxscore v=’harry’}. Więcej o parametrze tie można przeczytać tutaj: http://solr.pl/2012/02/06/do-czego-moze-przydac-sie-tie-w-dismaxie/.
Krótkie podsumowanie
Jak widać, Solr dostarcza nam naprawdę różnorodne i ciekawe parsery zapytań do wykorzystania. Za ich pomocą możemy stworzyć skomplikowane zapytania, które wykorzystają dużą część funkcjonalności Lucene. Należy jednak pamiętać, że im bardziej skomplikowane zapytanie, tym więcej mocy obliczeniowej będzie potrzebować Solr, aby je wykonać – warto o tym pamiętać przy konstrukcji tych bardziej skomplikowanych.