Wybierz region
pl
  • PL
  • EN
Wydrukuj

Elastic Search dla .NET Developerów w przykładach dla .NET Core – część 1

Niezależnie od języka, w którym programujemy oraz rozwiązań, które budujemy spotkamy się ostatecznie z problemem przeszukiwania danych tekstowych.

Jeżeli dodamy jeszcze do wymagań to że:
• rozwiązanie ma być szybkie dla dużej ilości danych
• uwzględniamy też błędy w pisowni słów
• interesują nas słowa o podobnym znaczeniu

Może się wtedy okazać że zwykły silnik każdej bazy danych może być nie wystarczający. Z pomocą przychodzi nam wtedy rozwiązanie Elastic Search.



Historia Elastic Search
Elastic Search jest to rozwiązanie pierwotnie stworzone przez Shaya Bannona oraz firmę Elastic NV w 2010 roku. Podstawowym mechanizmem wyszukiwania, który użyto w tym rozwiązaniu jest biblioteka Apache Lucene. Większość elementów tego rozwiązania jest dostępna w postaci otwartych źródeł. Rozwiązanie to można traktować jako pewien stos technologiczny zwany Elastic Stack, którego składowymi są następujące części:
• Elastic Search – centralny serwer indeksujący dane oraz umożliwiający wyszukiwanie zaindeksowanych danych. Komunikacja z nim oparta jest o protokół HTTP
• Kibana – narzędzie służące do przygotowywania wizualizacji danych zawartych na serwerze Elastic Search. Posiada również narzędzia developerskie do pracy bezpośredniej z tym serwerem
• Logstash – kolektor danych z silnikiem pracy w czasie rzeczywistym. Tworzymy w nim kolejki danych oraz mamy możliwość unifikacji danych z różnych źródeł, oraz daje możliwość wysyłania wyników do różnych rozwiązań w tym także do serwera Elastic Search
• Beat – rodzina narzędzi do pozyskiwania danych z różnych źródeł takich jak logi systemowe, metryki aplikacji, pakiety sieciowe oraz wspiera rozwiązanie monitorowania czy aplikacja nadal funkcjonuje (tak zwany heartbeat). Informacje te możemy wysyłać do Logstash lub bezpośrednio do Elastic Search
• APM – narzędzie do badania wydajności aplikacji oraz do zbierania metryk. Posiada wsparcie do monitorowania aplikacji napisanych w wielu językach taki jak: Java, .NET, Python oraz inne. Wspiera również frameworki do pisania w tych językach. W szczególności dla .NET umożliwia zbieranie metryk z aplikacji napisanych dla ASP.NET Core. Informacje te możemy wysyłać do Logstash lub bezpośrednio do Elastic Search.

Jak poprzednio wspomniałem mechanizm Elastic Search oparty jest na bibliotece Apache Lucene. W celu dobrego zrozumienia, w jaki sposób działa to rozwiązanie, powinniśmy zacząć od opisania mechanizmów wewnętrznych zaimplementowanych w bibliotece Apache Lucene. Zacznijmy jednak od krótkiej historii powstania tej biblioteki, by na zakończenie tego wpisu przejść do opisu działania algorytmów w niej zaimplementowanych.

Historia Apache Lucene
Projekt Apache Lucene został zapoczątkowany w roku 1997r przez Douga Cuttinga jako własny projekt rozwojowy. W 2000 został publicznie opublikowany a w 2001 został przekazany po opiekę Apache Software Foundation.

W dużym uproszczeniu biblioteka ta używa dwóch głównych algorytmów do wyszukiwania danych tekstowych a są nimi odpowiednio:

  • odwrócony indeks służący do wyszukiwania danych
  • odległość Levenshteina służąca do szybkiego wyszukiwania danych pomimo błędów literowych i słów podobnie brzmiących ("sounds like querying").

Odwrócony indeks
Indeks odwrócony jest to struktura podobna do indeksu , który występuje na końcu wielu książek, gdzie mamy podane słowo oraz odnośniki do stron, na których występuje. Podobnie jest w przypadku dla indeksu w Apache Lucene dla każdego słowo (tokenu) mamy listę odniesień do dokumentu, w których są zawarte. W Apache Lucene głównym niepodzielnym elementem jest dokument. W dokumentach możemy wyróżnić pola, które tworzą ich strukturę.

Indeks w Apache Lucene zawiera też inne informacje takie jak:
• liczność występowania danego słowa (tokenu)
• pola dokumentu, z którego pochodzi
• wiele jeszcze innych informacji

Najważniejszą jednak informacją, którą powinniśmy zapamiętać o indeksie odwróconym jest taka, że jest on indeksem alfabetycznym. Dlatego szukanie po znanym początku, czyli prefiksie jest dość naturalne, ale już po jego sufiksie, czyli części końcówki jest mniej efektywne. Powinniśmy o tym pamiętać budując nasze wyszukiwania.

Odległość Levenshteina
Jest to miara odmienności dwóch napisów od siebie. W przypadku gdy słowa są takie same przyjmuje ona wartość 0 a gdy są różne oznacza minimalną liczbę zmian pojedynczej litery w słowie, które muszą zajść, by z jednego słowa otrzymać drugie. Dla przykładu słowo „kot” i słowo „nos” różnią dwie zmiany „t” na „s” oraz „k” na „n” dlatego jego miara Levenshteina wynosi 2.

To już koniec tego wpisu, ale oczywiście nie koniec naszej przygody z Elastic Search. Podsumowując możemy zauważyć, że Elastic Search to bardzo ciekawe kompleksowe rozwiązanie wielu problemów z zakresu przeszukiwań dużej bazy dokumentów, opartych na tekście. W następnym wpisie pokażemy jak uruchomić lokalnie środowisko dla Elastich Search i napiszemy pierwsze zapytania wyszukujące dane.


Remigiusz Mrozek

Architekt w Pionie Energetyki i Gazownictwa. Na co dzień koduje w C#, prywatnie pasjonat nowych technologii ze szczególnym ukłonem w odmęty Big Data i Machine Learningu. Mistrz Gry, zawsze z najbardziej psychodeliczną fabułą. Można go spotkać na Coperniconie i Pyrkonie!


Wydrukuj