Faceting, eliminowanie filtrów i jak z tego skorzystać?

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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *