W poprzednich częściach (cz. 1, cz. 2) cyklu dowiedzieliśmy w jaki sposób można wykorzystać Solr, aby uzyskać funkcjonalność autocomplete. W dzisiejszym wpisie pokażę w jaki sposób dodać do komponentu Suggester słownik, a tym samym mieć wpływ na generowane podpowiedzi.
Konfiguracja komponentu
Do konfiguracji komponentu przedstawionej w poprzedniej części dodajmy następujący parametr:
<str name="sourceLocation">dict.txt</str>
Zatem nasza konfiguracja powinna wyglądać następująco:
<searchComponent name="suggest" class="solr.SpellCheckComponent"> <lst name="spellchecker"> <str name="name">suggest</str> <str name="classname">org.apache.solr.spelling.suggest.Suggester</str> <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str> <str name="field">name_autocomplete</str> <str name="sourceLocation">dict.txt</str> </lst> </searchComponent>
Poinformowaliśmy komponent, że ma korzystać ze słownika o nazwie dict.txt, który znajduje się w katalogu z plikami konfiguracyjnymi Solr.
Konfiguracja handlera
Do konfiguracji handlera także dodamy jeden parametr, będzie on następujący:
<str name="spellcheck.onlyMorePopular">true</str>
Zatem konfiguracja powinna wyglądać następująco:
<requestHandler name="/suggest" class="org.apache.solr.handler.component.SearchComponent"> <lst name="defaults"> <str name="spellcheck">true</str> <str name="spellcheck.dictionary">suggest</str> <str name="spellcheck.count">10</str> <str name="spellcheck.onlyMorePopular">true</str> </lst> <arr name="components"> <str>suggest</str> </arr> </requestHandler>
Parametr ten mówi, aby komponent zwrócił tylko takie podpowiedzi, dla których ilość wyników wyszukiwania będzie większa od ilości wyników wyszukiwania dla aktualnego zapytania.
Słownik
Wcześniej powiedzieliśmy Solr, aby korzystał ze słownika, ale jak ma wyglądać przykładowy słownik. Do celów artykułu zdefiniowałem następujący słownik:
# przykladowy slownik Dysk twardy hitachi Dysk twardy wd 2.0 Dysk twardy jjdd 3.0
Jak wygląda konstrukcja słownika ? Każda z fraz (bądź pojedynczy wyrazów) znajduje się w oddzielnej linii. Każda linia zakończona jest wagą danej frazy (pomiędzy wagą a frazą występuje znak tabulacji) wykorzystywanej wraz z parametrem spellcheck.onlyMorePopular=true (im wyższa waga, tym wyżej znajdzie się podpowiedź). W przypadku pominięcia wagi Solr sam dodaje wartość domyślną wynoszącą 1. Słownik powinien być zapisany w kodowaniu UTF-8. Linie rozpoczynające się od znaku # są pomijane.
Dane
W tym wypadku nie potrzebujemy danych – komponent korzysta jedynie ze słownika.
Sprawdźmy jak to działa
W celu sprawdzenia jak działa nasz mechanizm zadajemy do Solr następujące zapytanie, oczywiście wcześniej przebudowując indeks mechanizmu:
/suggest?q=Dys
W odpowiedzi dostajemy następujące wyniki:
<?xml version="1.0" encoding="UTF-8"?> <response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">0</int> </lst> <lst name="spellcheck"> <lst name="suggestions"> <lst name="Dys"> <int name="numFound">3</int> <int name="startOffset">0</int> <int name="endOffset">3</int> <arr name="suggestion"> <str>Dysk twardy jjdd</str> <str>Dysk twardy hitachi</str> <str>Dysk twardy wd</str> </arr> </lst> </lst> </lst> </response>
Kilka słów na koniec
Jak widać podpowiedzi zostały posortowane według wysokości wag, czyli zgodnie z oczekiwaniami. Warto zauważyć także, że zapytanie zostało zadane dużą literą, co również ma dość duże znaczenie – zadanie zapytania małą literą spowoduje wygenerowanie zerowej listy podpowiedzi.
Co można powiedzieć o metodzie – jeżeli mamy bardzo dobre słowniki z wygenerowanymi wagami np. na podstawie zachowań klientów, jest to metoda generowania podpowiedzi, która zdobędzie sympatię klientów. Nie polecam jej jednak w przypadku pierwszych kroków z podpowiedziami i nieposiadania słowników – wtedy podpowiedzi mogą, choć oczywiście nie muszą, być słabej jakości.
Co dalej
Ilość zajęć nie pozwoliła mi niestety na przeprowadzenie testów wydajnościowych poszczególnych metod, dlatego też w następnej części postaram się przedstawić, jak zachowują się poszczególne metody w zależności od struktury i wielkości indeksu.