W poprzednim artykule opisującym możliwe podejście do funkcjonalności autocomplete na polach wielowartościowych skorzystaliśmy z highlightingu, aby wydobyć te informacje, które nas interesowały. Obiecaliśmy także, że wrócimy do tematu i pokażemy, jak osiągnąć podobny efekt z wykorzystaniem facetingu. Zatem, spójrzmy jak wygląda realizacja takiej funkcjonalności.
Kilka słów na początek
Ze względu na to, że jest to niejako kontynuacja poprzedniego wpisu, sugerujemy, aby przeczytać wpis „Autocomplete na polach wielowartościowych (highlighting)„, aby wszystkie elementy wpisu były jasne. Warto także wspomnieć, iż metoda ta była już pokazywana we wpisie „Solr i autocomplete (cz. 1)„, aczkolwiek chcieliśmy przypomnieć ten temat ze względu na częstotliwość pojawiających się pytań.
Konfiguracja
Podobnie, jak w poprzednim wpisie zacznijmy od konfiguracji.
Struktura indeksu
Struktura naszego indeksu nie różni się od tego co zaprezentowane było w poprzednim wpisie. Jednak, przypomnijmy te informacje – zakładamy, że chcemy podpowiadać frazy z indeksu z pola wielowartościowego. Pole to nazywa się features, a cała konfiguracja pól w indeksie będzie następująca:
<fields> <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <field name="features" type="string" indexed="true" stored="true" multiValued="true"/> <field name="features_autocomplete" type="text_autocomplete" indexed="true" stored="true" multiValued="true"/> <field name="_version_" type="long" indexed="true" stored="true"/> </fields>
Do autocomplete będziemy wykorzystywać pole features_autocomplete.
Kopiowanie
Dodatkowo, aby automatycznie zasilać danymi pole features_autocomplete skorzystamy z funkcjonalności copy field, a zatem do pliku schema.xml dodajemy następujący wpis:
<copyField source="features" dest="features_autocomplete"/>
Typ text_autocomplete
Typ text_autocomplete różni się od tego, co widzieliśmy w poprzednim wpisie. Tym razem wygląda on następująco:
<fieldType name="text_autocomplete" class="solr.TextField" positionIncrementGap="100"> <analyzer> <tokenizer class="solr.KeywordTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> </analyzer> </fieldType>
Ze względu na to, że będziemy korzystać z facetingu korzystamy z solr.KeywordTokenizerFactory oraz sprawiamy, aby wszystkie znaki były małe za pomocą solr.LowerCaseFilterFactory.
Przykładowe dane
Nasze dane są identyczne do tych, które wykorzystaliśmy w poprzednim wpisie i wyglądają następująco:
<add> <doc> <field name="id">1</field> <field name="features">Multiple windows</field> <field name="features">Single door</field> </doc> <doc> <field name="id">2</field> <field name="features">Single window</field> <field name="features">Single door</field> </doc> <doc> <field name="id">3</field> <field name="features">Multiple windows</field> <field name="features">Multiple doors</field> </doc> </add>
Zapytanie z facetingiem
Zobaczmy zatem, jak wyglądać będzie nasze zapytanie, kiedy wykorzystamy faceting.
Pełne zapytanie
W przypadku facetingu nasze zapytanie powinno wyglądać następująco:
q=*:*&rows=0&facet=true&facet.field=features_autocomplete&facet.prefix=sing
Kilka słów o dodanych parametrach:
- rows=0 – informujemy Solr, że nie jesteśmy zainteresowani wynikami wyszukiwania,
- facet=true – informujemy Solr, iż chcemy korzystać z facetingu,
- facet.field=features_autocomplete – określamy jakie pole ma zostać wykorzystane do facetingu,
- facet.prefix=sing – za pomocą tego parametru przekazujemy interesującą nas frazę.
Wyniki
Wyniki, które Solr zwraca na powyższe zapytanie, wyglądają następująco:
<?xml version="1.0" encoding="UTF-8"?> <response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">0</int> <lst name="params"> <str name="facet">true</str> <str name="q">*:*</str> <str name="facet.prefix">sing</str> <str name="facet.field">features_autocomplete</str> <str name="rows">0</str> </lst> </lst> <result name="response" numFound="3" start="0"> </result> <lst name="facet_counts"> <lst name="facet_queries"/> <lst name="facet_fields"> <lst name="features_autocomplete"> <int name="single door">2</int> <int name="single window">1</int> </lst> </lst> <lst name="facet_dates"/> <lst name="facet_ranges"/> </lst> </response>
Jak widać, w sekcji odpowiedzialnej za faceting, otrzymaliśmy te frazy, które nas interesowały wraz z ilością dokumentów w jakich się znajdują.
O czym pamiętać
Ważną rzeczą jest to, że wartości parametru facet.prefix nie są analizowane, zatem jeżeli zamiast frazy sing przekazalibyśmy frazę Sing Solr nie zwróciłby interesujących nas wyników. Należy o tym pamiętać.
Podsumowanie
Powyższy wpis pokazał drugi sposób podejścia do realizacji funkcjonalności autocomplete na polach wielowartościowych. Oczywiście nie wyczerpaliśmy tematu i kiedyś do niego wrócimy, ale na dzisiaj to wszystko. Mamy nadzieję, że komuś się przyda to co znalazł w tych artykułach 🙂