Aplikacja „sprzedaż samochodów” – SpellCheckComponent – czy naprawdę miałeś to na myśli ? (cz. 5)

Nadszedł czas, abyśmy dodali do naszej aplikacji sprzedaży samochodów kolejną ważną funkcjonalność. Będzie to mechanizm sprawdzania poprawności wpisanej frazy wyszukiwania oraz podpowiadania frazy poprawnej. Funkcjonalność ta stała się już standardem we wszystkich silnikach wyszukiwania, zatem i my zrobimy z niej użytek.

Analiza wymagań

Nasza baza samochodów jest już tak duża, że zawiera nazwy marek i modeli, których poprawne napisanie może sprawiać naszym klientom problemy, np:

    • marka: Bugatti
    • model: Veyron
    • marka: Daewoo
    • model: Lacetti
    • marka: Cadillac
    • model: Brougham
    • marka: Ford
    • model: Capri
    • marka: Maserati
    • model: Coupe

Przykłady zapytań, które zwróciły 0 wyników, ze względu na niepoprawnie wpisane nazwy (frazy):

  1. ?q=bugati+weyron
  2. ?q=daewo+laceti
  3. ?q=cadilac+brogham
  4. ?q=ford+kapri
  5. ?q=maseratti+coupe

Chcemy dodać funkcjonalność, która przy niepoprawnie wpisanych nazwach podpowie nam frazę, którą najprawdopodobniej klient miał na myśli, a której zastosowanie pozwoli nam wyszukać dokumenty związane z tą frazą.

Zmiany w solrconfig.xml

Najważniejszym elementem, który musimy dodać do pliku konfiguracyjnego solrconfig.xml jest komponent wykorzystujący klasę solr.SpellCheckComponent. Spróbujemy wykorzystać najprostszą, standardową konfigurację tego komponentu i przekonamy się, jak jego działanie sprawdzi się w praktyce:

Wyjaśnijmy sobie co znaczą poszczególne atrybuty:

    • classname – klasa która jest implementacją naszego mechanizmu podpowiadania poprawnej frazy wyszukiwania. Wykorzystujemy klasę solr.IndexBasedSpellChecker, która jako źródło podpowiedzi wykorzystuje indeks solr.

    • spellcheckIndexDir – katalog, w którym przechowywany będzie indeks mechanizmu popowiedzi.

    • field – nazwa pola zdefiniowanego w pliku schema.xml, wykorzystywanego jako pole źródłowe do generowania indeksu dla mechanizmu podpowiedzi. W naszym przypadku będzie to pole o nazwie „content”, co zostanie uzasadnionej później.

    • buildOnCommit – jeżeli atrybut ten będzie ustawiony na wartośc true, to indeks mechanizmu podpowiedzi zostanie automatycznie wygenerowany przy każdym uaktualnieniu (commit) indeksu solr.

Mamy już zdefiniowany komponent, zatem teraz należy go wykorzystać w którymś z handler’ów, aby można było się do niego odwoływać. Najlepiej dodać go do handler’a, którego domyślnie używamy do wyszukiwania dokumentów. W ten sposób będziemy mogli za pomocą tylko jednego żądania otrzymywać wyniki wyszukiwania wraz z podpowiedzią. Przed uaktualnieniem, nasz domyślny handler wyglądał tak:

Po zmianie, wygląda tak:

Jak widać, oprócz naszego komponentu spellcheck, dodaliśmy również dwie domyślne wartość wykorzystywane w zapytaniach:

    • spellcheck – ustawienie wartości na true powoduje że dla każdego requestu nastąpi próba wygenerowania podpowiedzi.

    • spellcheck.collate – ustawienie wartości na true powoduje że mechanizm wybiera najlepszą podpowiedź dla każdego wyrazu i konstruuje nowe zapytanie składające się z tych podpowiedzi. Jeżeli mechanizm uzna, że dany wyraz jest poprawny, zostawia go w niezmienionej postaci.

Zmiany w schema.xml

Ewentualne zmiany w pliku schema.xml będą polegały na dodaniu pola, wykorzystywanego przez komponent solr.SpellCheckComponent jako źródło danych do generowania indeksu dla mechanizmu podpowiedzi. Pole takie powinno zawierać wszystkie informacje, jakie chcielibyśmy aby było użyte przy tworzeniu indeksu dla mechanizmu podpowiedzi. Typ takiego pola powinien zapewniać odpowiednią tokenizację indeksowanych danych, jak i być pozbawionym wszelkich filtrów używających stemmingu czy lametyzacji, co by mogło niekorzystnie wpłynąć na wyniki podpowiedzi.

Nasza schema posiada już pole spełniające wszystkie te wymaganie, a nazywa się „content”. Dla przypomnienia, jest to pole domyślne, po którym realizowane jest wyszukiwanie przez silnik solr. Przypomnijmy sobie aktualną definicję tego pola, jak i jego typu:

Do pola „content” kopiowane są wartości z pól marki, modelu i roku:

Tworzymy zapytania

Wykorzystamy zapytania z analizy wymagań, które nie zwróciły nam żadnych wyników, dodając parametr spellcheck.q, gdzie wpisujemy tę samą frazę co dla parametru q. W ten sposób, za pomocą jednego zapytania zwrócimy wyniki wyszukiwania wraz z wynikami mechanizmu podpowiedzi:

  1. ?q=bugati+weyron&spellcheck.q=bugati+weyron

      Mechanizm podpowiedzi poprawił nam wyrazy zapytania na poprawne i dodatkowo funkcjonalność „collation” wygenerowała nam gotowe zapytanie, które możemy wykorzystać w celach zwrócenia nam poprawnych wyników wyszukiwania. Sprawdźmy kolejne przykłady:

  2. ?q=daewo+laceti&spellcheck.q=?q=daewo+laceti
  3. ?q=cadilac+brogham&spellcheck.q=cadilac+brogham
  4. ?q=ford+kapri& spellcheck.q=?q=ford+kapri
  5. ?q=maseratti+coupe&spellcheck.q=?q=maseratti+coupe

Mechanizm spellcheck zadziałał dla naszych przypadków perfekcyjnie, poprawiając błędnie wpisane wyrazy i generując poprawne zapytanie. W dwóch ostatnich przypadkach (4,5) możemy zaobserwować że mechanizm nie wygenerował podpowiedzi dla poprawnie wpisanych wyrazów (4 – ford, 5 – coupe) lecz wykorzystał je do złożenia poprawnego zapytania (collation).

Podsumowanie

Nasz silnik wyszukiwania został wzbogacony o funkcjonalność sprawdzania poprawności wpisanej frazy. Zostało nam czekać na opinie klientów … i być może jakieś uwagi.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

This site uses Akismet to reduce spam. Learn how your comment data is processed.