Elasticsearch rozumie po polsku

Elasticsearch ma oficjalny polski plugin.  Stempel.  Udało mi się go testować i sprawdzać.  I choć polski analizator pozostawia trochę do życzenia to robi niezłą robotę.  Przypadek użycia?  Indeksujemy i wyszukujemy RSS feed z ofertami pracy ze znanego polskiego portalu.

Architektura rozwiązania

Chcę wyszukiwać wpisy na RSS.  Żeby to zrobić muszę je gdzieś agregować.  Pierwszym elementem każdego pajplajna jest Data Ingestion.  W moim wypadku na początek wykorzystam mój mikrokomputerek.  Będzie pieczołowicie zbierał wpisy do pliku.  Tenże plik potem będę zaciągał i indeksował w Elasticsearch – markowy silnik wyszukiwania.  A że wpisy są po polsku to będę ewaluował rozwiązanie polskiego analizatora.

Pracowite Raspberry

Dlaczego?  Bo nie znałem jeszcze Amazon i AWS 🙂  Tak tak, wiem, mamy kosze w S3 i automatyczne wyzwalacze które wyzwalają uśpione Lambdy.  Tak wiem że można inaczej.  Ale leży ten mój Raspberry taki zakurzony, no to myślę sobie: „A dam chłopu robotę!”

Zbieram dane

Dane agregowane są w pliku CSV.  Ot, taki popularny format danych.  Jest to o tyle wygodne, że w Pythonie fajnie się takie pliki obsługuje – mega proste pisanie i czytanie – a także korzystając z pewnych zaawansowanych bibliotek można potem te dane analizować, jak choćby w Pandas.  Dane czytane są przez proste i wygodne czytajdło pod nazwą rssparser.  A oto wyciąg z kodu

Następnie te dane pobieramy na kompa.  I indeksujemy.  No właśnie, ale do czego?  Do Elasticsearcha

Elasticsearch i polska instalacja

Elasticsearch od lat (jeden i pół) wykorzystuję w postaci dockerowego obrazu.  Jeszcze nigdy mnie nie zawiódł 🙂 Tylko pamiętaj wystawiaj wolumeny zewnętrznie bo jak nie to 1) potracisz zapisane indeksy, 2) spuchnie Ci obraz.  Oto przykład jak to uruchamiam:

„Ale to nie jest oficjalny obraz” – zaoponujesz.  A no tak, zapomniałem.  Elasticsearch jest leciutko przeze mnie spersonalizowany.  Doinstalowałem polską wtyczkę – analizator Stempel.  Bo będziemy indeksować polskie teksty.

Jak już zainstalowałeś (możesz uruchomić także na swojej instancji) to sprawdź czy Ci działa.  Zrobiłem nawet taki skrypt który to sprawdzi:


W odpowiedzi powinieneś otrzymać token o treści burak.

Indeksujemy

Domyślnie do obsługi Elasticsearcha wygodnie jest zbierać dane przy pomocy dedykowanych rozwiązań jak Filebeat czy Logstash.  I tak też to pierwotnie wyglądało.  Logstash udostępnia Ci filtr csv, który rozbiera plik CSV na Python-dictowy dokument. Jednakowoż w wypadku wolumenów, które nie będą zbierane tak często, można użyć prostych Pythonowych bibliotek, tak jak zrobiłem to w skrypcie indeksującym:

Próbujemy

A teraz test E2E, wygenerujmy zapytanie które wykorzysta analizator i zapyta o pracę marzeń, np taką z Python i Elasticsearch, no może być też Java

Rezultat?

Wynik wykorzystuje mechanizmy skoringu, które pozwalają na dobór najbardziej pasujących wyników, bowiem właśnie relevance to cecha wyszukiwań pełnotekstowych jak to tutaj ładnie opisano na stronie elastic.co.

TL;DR

Elasticsearch udostępnia prosty i dobry analizator który możesz podpiąć pod dowolne źródło danych. Udało się to tutaj zrobić dla RSS. Dane pobierane są przez napisany w Pythonie program na RaspberryPi. Kod „aplikacji” jest oczywiście na Githubie.