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.

This post is also available in: angielski

This entry was posted on poniedziałek, Grudzień 6th, 2010 at 08:28 and is filed under Solr, Tutorial. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

8 komentarzy to “Faceting, eliminowanie filtrów i jak z tego skorzystać ?”

  1. Piotrek Says:

    hej, sorka, że znowu nie ma temat… ale może jakiś krótki artykuł o polskich znakach w solr? mam mały problem a przydałoby się, żeby zawsze gdzieś był dostęp do wiadomości na ten temat:)

  2. gr0 Says:

    W sumie fajny pomysł, pomyślimy nad opisaniem tematu znaków narodowych.

  3. Piotrek Says:

    a może taka szybka porada dla mnie? bo potrzebne to mi bardzo:)

  4. gr0 Says:

    Bez znajomości problemu nie pomożemy 😉 Powiedz co się dzieje ?

  5. Piotrek Says:

    w solr mam pole zdefiniowane tak:

    <fieldType name=”c_string” class=”solr.TextField”>
    <analyzer type=”index”>
    <tokenizer class=”solr.KeywordTokenizerFactory”/>
    <filter class=”solr.ASCIIFoldingFilterFactory”/>
    <filter class=”solr.LowerCaseFilterFactory” />
    <filter class=”solr.ReversedWildcardFilterFactory” />
    </analyzer>
    <analyzer type=”query”>
    <tokenizer class=”solr.KeywordTokenizerFactory”/>
    <filter class=”solr.ASCIIFoldingFilterFactory”/>
    <filter class=”solr.LowerCaseFilterFactory” />
    <filter class=”solr.ReversedWildcardFilterFactory” />
    </analyzer>
    </fieldType>

    oraz:

    <field name=”word” type=”c_string” indexed=”true” stored=”true” />

    w word mam polskie znaki, ale gdy zrobię zapytanie w polskim znakiem, np. „word:*ą*” to nic mi nie znajdzie

  6. Piotrek Says:

    kurde wyciął mi znaczniki… wyślę na maila

  7. gr0 Says:

    Postaram się zajrzeć do tego jutro i dać znać jak rozwiązać problem.

  8. gr0 Says:

    Pozwoliłem sobie zmodyfikować komentarz, żeby był widoczny dla innych czytelników. Opis problemu i możliwe rozwiązanie już w poniedziałek w krótkim wpisie 😉