poprzednim wpisie zaprezentowałem jak wykorzystać Synonym Token Filter. W przykładach, które przytoczyłem wszystko działało perfekcyjnie. Okazało się jednak, że są sytuacje, w których Synonym Token Filter nie zadziała tak jak byśmy się tego spodziewali. Uświadomił mnie o tym Zbyszko (dzięki! 🙌), w jednym z komentarzy na Facebooku. Przestudiowałem załączone materiały i stwierdziłem, że całość zasługuje na odrębny wpis. I oto jest 🙂

Cykl artykułów "Uczymy się Elasticsearch"

Ten wpis jest częścią cyklu, w którym staram się pokazać w jaki sposób możesz zbudować przyjazną dla użytkownika wyszukiwarkę, wykorzystując do tego celu potężny silnik wyszukiwania jakim jest Elasticsearch.

Do tej pory w ramach cyklu ukazały się następujące artykuły:

  1. instalacja, uruchomienie i pierwsze zapytanie
  2. kilka słów na temat Elastic Stack
  3. przydatne narzędzia
  4. indeks odwrócony Apache Lucene
  5. wyszukiwanie pełnotekstowe
  6. trafność
  7. przygotowanie tekstu do optymalnego wyszukiwania
  8. coś poszło nie tak, czyli seria moich fackupów
  9. zaczarowany zakreślacz
  10. o co jeszcze możemy zapytać?
  11. schowaj się za aliasem
  12. zadbaj o bezpieczeństwo
  13. wstępne procesowanie dokumentów przed indeksowaniem
  14. przegląd klientów języka Java
  15. synonimy w wynikach wyszukiwania
  16. synonimy w wynikach wyszukiwania (dogrywka)
  17. ...

Kiedy Synonym Token Filter zadziała?

Na początek potwierdźmy, że poprzedni artykuł nie kłamał i Synonym Token Filter w ogóle działa.

Dodajmy przykładowy dokument do naszego indeksu:

Następnie wyszukajmy go najprostszym możliwym zapytaniem, z tym, że zamiast imienia i nazwiska użyjemy pseudonimu:

Jak można się było spodziewać, prondzyn nie został znaleziony:

Powiedzmy więc Elasticsearchowi, żeby wyszukiwanie pseudonimu prondzyn traktował tak samo jak wyszukiwanie imienia i nazwiska Piotr Prądzyński:

Dodajmy ten sam dokument do ulepszonego indeksu:

I wyszukajmy ponownie:

Mamy to:

Czyli faktycznie, w tej sytuacji, przy prostym zapytaniu typu match, Synonym Token Filter działa prawidłowo.

Kiedy Synonym Token Filter nie zadziała?

Spróbujmy teraz wyszukać frazę (match_phrase) zamiast pojedynczego słowa:

Na razie działa, ale w tym momencie Elasticsearch nie musiał korzystać z synonimów:

Spróbujmy teraz podobnego zapytania, ale z wykorzystaniem synonimu:

Nie działa 🙁

Dlaczego tak się stało?

Odpowiedź na to pytanie została bardzo ładnie opisana przez Michaela McCandlessa, współautora książki Lucene in Action, w artykule: Lucene’s TokenStreams are actually graphs!

Artykuł jest krótki i przejrzysty, więc nie będę go duplikował i opisywał tu wszystkich szczegółów, ale generalnie chodzi o to, że strumień tokenów to tak naprawdę graf. Kiedy tworzymy synonimy składające się z różnej liczby tokenów to zaburzamy strukturę grafu. W takim przypadku liczba węzłów w grafie z wykorzystaniem synonimu nie jest równa liczbie węzłów w grafie oryginalnym. Tak też stało się w naszym przykładzie kiedy to pseudonim składał się z jednego tokena, a imię i nazwisko z dwóch.

Synonym Graph Token Filter na ratunek!

Co robić? Jak żyć? Na szczęście twórcy Elasticsearcha zdążyli przygotować już rozwiązanie zastępcze: Synonym Graph Token Filter, a Michael McCandless opisał je w artykule: Multi-Token Synonyms and Graph Queries in Elasticsearch.

Zmodyfikujmy teraz nasz przykład, używając grafowego filtra synonimów:

Dodajmy dokument:

Wyszukajmy w dokładnie ten sam sposób:

Działa, ale w tym momencie nie zaprzęgaliśmy synonimów do pracy:

Zapytajmy ponownie, z wykorzystaniem synonimów:

Działa! 🙂

Czy Synonym Token Filter jest jeszcze potrzebny?

Jak najbardziej. Synonym Graph Token Filter nie jest lekarstwem na całe zło. Ze względu na to, że znajdujący się pod spodem index Lucene nie potrafi przechowywać grafu, to Synonym Graph Token Filter może być użyty wyłącznie w czasie wyszukiwania, co pociąga za sobą większe zużycie CPU i IO. Jeżeli chcemy składować synonimy w indeksie (na przykład ze względu na wydajność), to nadal musimy wykorzystać Synonym Token Filter.

The End

Muszę przyznać, że lubię takie sytuacje 🙂 Momenty, kiedy publikuję coś na blogu, a ktoś na tej podstawie podpowie mi, co można zrobić lepiej. Jest to definitywnie jeden z moich ulubionych benefitów wynikających z blogowania – Twój feedback i nauka na jego podstawie. Teraz również na niego czekam 🙂 Jeżeli tylko masz jakieś uwagi do dzisiejszego wpisu (lub jakiegokolwiek innego) to śmiało pisz do mnie w komentarzach albo gdzie Ci tam tylko wygodnie.


Bądź na bieżąco!

Podobają Ci się treści publikowane na moim blogu? Nie chcesz niczego pominąć? Zachęcam Cię do subskrybowania kanału RSS, polubienia fanpage na Facebooku, zapisania się na listę mailingową:




Uwaga! Jeżeli w ciągu 24-godzin od zapisania się na listę mailingową nie otrzymasz wybranego przez siebie prezentu to skontaktuj się ze mną.

Powyższe dane są przechowywane w systemie GetResponse i nie są udostępniane nikomu innemu. Więcej szczegółów znajdziesz na stronie polityki prywatności.

lub śledzenia mnie na Twitterze. Generalnie polecam wykonanie wszystkich tych czynności, bo często zdarza się tak, że daną treść wrzucam tylko w jedno miejsce. Zawsze możesz zrobić to na próbę, a jeśli Ci się nie spodoba – zrezygnować :)

Dołącz do grup na Facebooku

Chcesz więcej? W takim razie zapraszam Cię do dołączenia do powiązanych grup na Facebooku, gdzie znajdziesz dodatkowe informacje na poruszane tutaj tematy, możesz podzielić się własnymi doświadczeniami i przemyśleniami, a przede wszystkim poznasz ludzi interesujących się tą samą tematyką co Ty.

W grupie Programista Na Swoim znajdziesz wiele doświadczonych osób chętnych do porozmawiania na tematy krążące wokół samozatrudnienia i prowadzenia programistycznej działalności gospodarczej. Vademecum Juniora przeznaczone jest zaś do wymiany wiedzy i doświadczeń na temat życia, kariery i problemów (niekoniecznie młodego) programisty.

Wesprzyj mnie

Jeżeli znalezione tutaj treści sprawiły, że masz ochotę wesprzeć moją działalność online, to zobacz na ile różnych sposobów możesz to zrobić. Niezależnie od tego co wybierzesz, będę Ci za to ogromnie wdzięczny.

Na wsparciu możesz także samemu zyskać. Wystarczy, że rzucisz okiem na listę różnych narzędzi, które używam i polecam. Decydując się na skorzystanie z któregokolwiek linku referencyjnego otrzymasz bonus również dla siebie.

Picture Credits