Podczas codziennej pracy wiele razy widziałem powtarzające się zapytania do Solr różniące się jednym filtrem. Kiedy pytałem się dlaczego tak – odpowiadano mi, że konieczne jest pobranie wyników facetingu, ale dla różnych zawężeń za pomocą filtrów. Jeżeli korzystacie z Solr w wersji 1.4 lub późniejszej to moja propozycja to korzystanie z local params – co to jest i jak z tego skorzystać – ten wpis postara się odpowiedzieć na oba pytania.
Założenia
W celu pokazania jak korzystać z facetingu i local params załóżmy następującą sytuację. Mamy w indeksie cztery pola opisujące dokument:
- id – unikalny identyfikator,
- name – nazwa firmy,
- voivodship – województwo w jakiej znajduje się firma,
- city – miasto w którym znajduje się firma.
Dla uproszczenia przyjmijmy, iż pola id, voivodship oraz city są typu string. Pole name jest typu text. Pola nie są wielowartościowe, a definicja typów jest taka jak w standardowej dystrybucji Solr.
Cel
Co chcemy uzyskać. Oprócz znalezienia firmy, której nazwa pasuje do wpisanej przez użytkownika fraz, użytkownik podaje także nazwę województwa i miasta. Wszystkie parametry są konieczne do podania – takie uproszczenie, aby przykład był prostszy. Do tego musimy pokazać dwa rodzaje facetingu:
- miasta w których znajdują się firmy pasujące do wpisanej frazy niezawężone do wybranego województwa,
- wszystkie województwa w których znajdują się firmy pasujące do wpisanej frazy.
Podejście standardowe
Standardowe podejście mogłoby polegać na wygenerowaniu dwóch zapytań:
q=FRAZA&fq=city:MIASTO&voivodship:WOJEWÓDZTWO
q=FRAZA&facet=true&facet.field=city&facet.field=voivodship
Pierwsze odpowiada za pobranie firm pasujących do wpisanej frazy i zawężonych do wybranego miasta i województwa, natomiast drugie daje nam upragniony faceting bez zawężeń.
Local params
Solr 1.4 przyniósł ciekawą funkcjonalność – local params. W naszym wypadku liczy się to, iż funkcjonalność pozwala na tagowanie i eliminowanie filtrów z facetingu. Powyższe dwa zapytania możemy zamienić na następujące:
q=FRAZA&fq={!tag=tagCity}city:MIASTO&fq={!tag=tagVoivodship}voivodship:WOJEWODZTWO&facet=true&facet.field={!ex=tagCity,tagVoivodship}city&facet.field=!{ex=tagCity,tagVoivodship}voivodship
Jak to działa ?
Po pierwsze dla każdego z filtrów (parametr fq) definiujemy unikalny tag, za pomocą którego będziemy mogli się odwoływać tego filtra. Aby to zrobić stosujemy konstrukcję {!tag=NAZWA_TAGA}.
Następnie dla każdego z pól po których chcemy wykonać faceting dodajemy informacje o tym, które filtry należy wykluczyć. W naszym przypadku chcemy wykluczać oba filtry w obu polach po których robimy faceting. Aby to zrobić stosujemy następującą konstrukcję {!ex=NAZWA_TAGA_1,NAZWA_TAGA_2,…}.
Kilka słów na koniec
Oczywiście funkcjonalność local params to nie tylko faceting i możliwość wykluczania nazwanych filtrów. Obiecuję, że w przyszłości pojawi się kolejny wpis szerzej opisujący możliwości jakie niesie ze sobą ta funkcjonalność Solr wprowadzona w wersji 1.4.