Co to jest Elasticsearch?

W dynamicznym świecie danych, kluczowa jest umiejętność szybkiego odnajdywania i analizowania informacji. Tutaj z pomocą przychodzi Elasticsearch – potężny, otwarty i skalowalny silnik do wyszukiwania i analizy danych, oparty na solidnych fundamentach Apache Lucene. Zapomnij o żmudnym przeszukiwaniu ogromnych baz danych – dzięki Elasticsearch możesz przeszukiwać pełnotekstowo, filtrować i agregować dane niemal w czasie rzeczywistym, co otwiera zupełnie nowe możliwości dla Twojego biznesu.

Elasticsearch

Elasticsearch to nie tylko wyszukiwarka – to wszechstronne narzędzie, które stanowi serce Elastic Stack (dawniej ELK Stack) i znajduje zastosowanie w logowaniu, monitoringu, systemach bezpieczeństwa (SIEM), analizie biznesowej czy personalizacji wyników wyszukiwania. Jego siłą jest rozproszona architektura, oparta na klastrach, node’ach i shard’ach. Oznacza to, że Elasticsearch potrafi rosnąć razem z Twoimi danymi i ruchem, zapewniając stabilność i odporność na awarie. Standardowa komunikacja odbywa się przez przyjazne REST API, co ułatwia integrację z dowolnymi aplikacjami, choć istnieją również inne możliwości komunikacji, typu GraphQL.

Elasticsearch wyróżnia się na tle innych rozwiązań. Chociaż istnieje jego odgałęzienie w postaci OpenSearch (rozwijane przez AWS pod inną licencją), w wielu testach to Elasticsearch często pokazuje swoją przewagę w wydajności i innowacyjności. Dzięki intuicyjnemu interfejsowi Kibana, zarządzanie danymi i tworzenie imponujących wizualizacji staje się proste i przyjemne. Dodatkowo, mechanizm snapshotów zapewnia bezpieczeństwo Twoich danych, umożliwiając łatwe tworzenie i odtwarzanie kopii zapasowych.

W dalszej części opisu narzędzia Elasticsearch zagłębimy się w jego budowę, omówimy jego wszechstronne możliwości, porównamy go z OpenSearch, przyjrzymy się sposobom przechowywania danych oraz zarządzaniu nimi przez Kibana i mechanizm snapshotów. Pokażemy również, jak rozpocząć swoją przygodę z Elasticsearch w praktyce, przedstawiając proces instalacji na różnych platformach, podstawy komunikacji, wyszukiwania pełnotekstowego oraz koncepcję odwróconego indeksu.

Chcesz przyspieszyć wyszukiwanie w swojej firmie? Skontaktuj się z nami już dziś!

Jak zbudowany jest Elasticsearch?

Skoro wiesz już, czym jest Elasticsearch, przyjrzyjmy się jego architekturze.

Elasticsearch działa w modelu rozproszonym, w którym instancje zwane node’ami łączą się w klastry, a każdy indeks dzielony jest na wiele shard’ów (fragmentów) rozłożonych na różnych node’ach, co zapewnia skalowalność i odporność na awarie.

Wyjaśnijmy sobie te kluczowe elementy:

  • Node: Wyobraź sobie node’a jako pojedynczy serwer, na którym działa Elasticsearch. Każdy taki serwer ma swoją nazwę i domyślnie działa na porcie 9200. To właśnie node’y zajmują się przetwarzaniem i przeszukiwaniem Twoich danych.
  • Cluster: To po prostu zbiór jednego lub więcej node’ów pracujących razem. Dzięki temu Elasticsearch może działać w sposób rozproszony.
  • Index: Możesz myśleć o indeksie jako o kolekcji dokumentów, które są ze sobą powiązane tematycznie lub strukturalnie. Nazwa indeksu jest bardzo ważna – używasz jej, aby wskazać, w którym miejscu szukasz danych, dodajesz nowe dokumenty lub usuwasz istniejące. Jeśli znasz relacyjne bazy danych, to indeks w Elasticsearch jest trochę jak cała baza danych.
  • Document: Dokument to pojedynczy rekord, który przechowujesz w Elasticsearch. Przypomina dodawanie wiersza do tabeli w relacyjnej bazie danych, z tą kluczową różnicą, że dokumenty w Elasticsearch są przechowywane w elastycznym formacie JSON.

Typy (types) w starszych wersjach Elasticsearch grupowały dokumenty w indeksie, jednak od wersji 7.x zostały usunięte – każdy indeks zawiera teraz logicznie powiązane dokumenty bez podziału na typy.

Cluster health (kondycja klastra) monitoruje stan wszystkich node’ów, wskazując statusy zielony (wszystko OK), żółty (jedna replika niedostępna) lub czerwony (brak dostępnych shard’ów).

Elasticsearch search analytics

Możliwości Elasticsearch

Dzięki swojej wszechstronności, Elasticsearch znajduje zastosowanie w wielu obszarach. Oto obszary, w których Elasticsearch naprawdę błyszczy:

  • pełnotekstowe wyszukiwanie z uwzględnieniem odmian, błędów literowych i rankingiem trafności,
  • filtrowanie dokumentów na podstawie wartości pól (range, term, match),
  • agregacje (metrics, bucket) do szybkiego liczenia i grupowania danych,
  • analiza logów i metryk w czasie rzeczywistym (ELK Stack),
  • SIEM i Security Analytics dzięki Elastic Security,
  • personalizację wyników wyszukiwania (boosting, function score),
  • rozproszone przechowywanie i wyszukiwanie w klastrach o setkach node’ów.

Opensearch vs Elasticsearch

Świat Elasticsearch doświadczył pewnego rozłamu w 2021 roku, kiedy firma Elastic zmieniła licencję Elasticsearch i Kibany na bardziej restrykcyjne (SSPL/Elastic License od wersji 7.11).

W odpowiedzi na to, firma AWS (Amazon Web Services), która intensywnie wykorzystywała Elasticsearch w swoich usługach, wraz ze społecznością, stworzyła OpenSearch.

Jest to “fork” (czyli niezależna gałąź rozwoju) Elasticsearch i Kibany, który pozostał na bardziej otwartej licencji Apache 2.0.

Główna różnica leży więc w licencji i filozofii. Elasticsearch, choć wciąż posiada wersję darmową, w pełni komercyjne funkcje dostępne są na płatnych licencjach. OpenSearch stawia na pełną otwartość kodu i jest rozwijany we współpracy ze społecznością.

Często pojawia się pytanie o wydajność. Według niektórych testów, Elasticsearch potrafi być szybszy od OpenSearch i efektywniej wykorzystywać zasoby.

Różnice te mogą być znaczące, sięgając kilkudziesięciu czy nawet ponad stu procent, ale pamiętajmy, że wydajność może zależeć od wielu czynników, w tym konfiguracji i specyfiki obciążenia.

Z kolei OpenSearch mocno integruje się z ekosystemem AWS, co jest jego zaletą dla użytkowników tej chmury.

Wybór między nimi często zależy od potrzeb: czy priorytetem jest otwartość i integracja z AWS (OpenSearch), czy może dostęp do najnowszych funkcji komercyjnych i potencjalnie wyższa wydajność w niektórych zastosowaniach (Elasticsearch).

Dane w Elasticsearch

Elasticsearch przechowuje dane w formie dokumentów, które są zapisane w popularnym formacie JSON. Możesz myśleć o dokumencie JSON jak o elastycznym kontenerze na Twoje informacje, gdzie dane są zorganizowane w pary klucz-wartość (jak w słowniku czy mapie).

Dokumenty te są grupowane w indeksy, o których mówiliśmy wcześniej – to taka kolekcja powiązanych ze sobą dokumentów.

Indeksy są następnie dzielone na mniejsze części zwane shard’ami, co pozwala Elasticsearch na rozproszenie danych na wiele node’ów i szybkie przeszukiwanie równoległe.

Kluczowym elementem w zarządzaniu danymi jest mapping. Mapping to jakby “schemat” lub “definicja struktury” Twoich dokumentów w indeksie.

Określa on, jakiego typu dane znajdują się w poszczególnych polach dokumentu (np. tekst, liczba, data) oraz jakie analizatory powinny być użyte do przetworzenia pól tekstowych przed ich zaindeksowaniem.

Elasticsearch jest dość inteligentny i potrafi automatycznie tworzyć mapping dynamiczny, gdy dodajesz dokumenty.

Jednak często najlepszym podejściem jest zdefiniowanie własnego, szczegółowego mappingu w formacie JSON, aby mieć pełną kontrolę nad sposobem indeksowania i przeszukiwania danych.

W przypadku pól tekstowych, analizatory odgrywają ogromną rolę w wyszukiwaniu pełnotekstowym.

Składają się z tokenizera (który dzieli tekst na tokeny, czyli pojedyncze “słowa”) i filtrów (które modyfikują te tokeny, np. usuwają wielkie litery, słowa kluczowe (stop words), czy sprowadzają słowa do formy podstawowej).

Dzięki analizatorom, wyszukiwanie jest bardziej elastyczne i trafne.

Elasticsearch Kibana

Jeśli Elasticsearch jest silnikiem do przeszukiwania i analizy danych, to Kibana jest Twoim oknem na te dane. Kibana to interfejs webowy, czyli aplikacja działająca w przeglądarce, która pozwala Ci w intuicyjny sposób pracować z danymi zgromadzonymi w Elasticsearch.

Kibana łączy się z Elasticsearch przez REST API, tak jak inne aplikacje. Daje Ci mnóstwo możliwości:

  • Eksploracja danych (Discovery): Możesz przeglądać surowe dane, filtrować je i wyszukiwać konkretne dokumenty, aby zrozumieć ich strukturę i zawartość.
  • Wizualizacje (Visualize): To tutaj dzieje się magia – możesz tworzyć różnego rodzaju wykresy, tabele, mapy i inne graficzne reprezentacje Twoich danych. Na przykład, możesz szybko zobaczyć, z jakich krajów pochodzi ruch na Twojej stronie, jakie produkty są najczęściej wyszukiwane, czy jak rozkłada się obciążenie na Twoich serwerach.
  • Dashboardy (Dashboard): Wizualizacje możesz grupować w interaktywne dashboardy. Dzięki temu masz na jednym ekranie pełny obraz sytuacji, np. panel monitorujący stan systemu, analizujący sprzedaż czy prezentujący logi aplikacji.
  • Zarządzanie klastrem: Kibana służy również do zarządzania samym klastrem Elasticsearch, np. do monitorowania jego stanu, zarządzania snapshotami (kopiami zapasowymi) czy konfigurowania użytkowników.

Kibana sprawia, że dane w Elasticsearch stają się dostępne i zrozumiałe nie tylko dla programistów, ale także dla analityków biznesowych, administratorów systemów i wszystkich, którzy potrzebują szybko zobaczyć i zrozumieć, co dzieje się z ich danymi.

Elasticsearch Kibana

Elasticsearch snapshot

Bezpieczeństwo i możliwość odtworzenia danych są kluczowe. W Elasticsearch służy do tego mechanizm snapshotów. Pozwala on na tworzenie przyrostowych kopii zapasowych Twoich danych, czyli backupów, które zawierają tylko te zmiany, które zaszły od momentu wykonania ostatniego snapshotu.

  • Snapshot: To funkcja przyrostowego backupu danych w Elasticsearch, realizowana przez REST-owe API Snapshot and Restore. Snapshot zapisuje segmenty indeks’u w zewnętrznym repozytorium (może to być system plików, S3, HDFS), a co ważne – deduplikuje niezmienione dane, co pozwala zaoszczędzić miejsce.
  • Restore: Gdy zajdzie potrzeba, funkcja restore pozwala na odtworzenie indeksów lub całego klastra do wybranego punktu w czasie. Jest to niezwykle przydatne w scenariuszach odzyskiwania po awarii, migracji danych czy tworzenia środowisk testowych na podstawie rzeczywistych danych.

Tutorial Elasticsearch

Teraz, gdy wiesz już czym jest i jak zbudowany jest Elasticsearch, przejdźmy do praktyki. Ta sekcja poprowadzi Cię przez podstawowe kroki instalacji Elasticsearch na różnych platformach – od popularnych systemów operacyjnych po kontenery Docker – oraz pokaże, jak rozpocząć z nim komunikację.

Przed rozpoczęciem upewnij się, że masz zainstalowane wymagane oprogramowanie, takie jak środowisko Java (JRE/JDK) oraz odpowiednie narzędzia do zarządzania pakietami (np. Homebrew na MacOS) lub konteneryzacji (Docker), w zależności od wybranej metody instalacji.

Pamiętaj, że są to podstawowe metody, a szczegółowe wymagania systemowe i specyfika instalacji mogą się różnić w zależności od wersji Elasticsearch i Twojego środowiska.

Po szczegóły zawsze warto zajrzeć do oficjalnej dokumentacji Elastic.

Instalacja i konfiguracja Elasticsearch

Najprostszą metodą instalacji na systemach desktopowych jest pobranie odpowiedniej paczki ze strony elastic.co, rozpakowanie jej i uruchomienie pliku startowego.

Pobierając paczkę ZIP ze strony elastic.co, rozpakowujemy, przechodzimy do katalogu bin i uruchamiamy elasticsearch (Linux/Mac) lub elasticsearch.bat (Windows).

Elasticsearch na MacOS

Jeśli używasz menedżera pakietów Homebrew na MacOS, możesz zainstalować Elasticsearch za pomocą poniższych poleceń:

bash

brew install elasticsearch
brew install openjdk
elasticsearch

Elasticsearch na Windows

Dla użytkowników systemu Windows dostępny jest instalator MSI, który przeprowadzi Cię przez proces instalacji.

Pobierz instalator MSI ze strony elastic.co, uruchom i postępuj zgodnie z kreatorem (Next → Next → Finish).

Elasticsearch na Linux

Na systemach Linux, szczególnie tych opartych na Debianie/Ubuntu, możesz skorzystać z repozytoriów Elastic, aby zainstalować Elasticsearch za pomocą menedżera pakietów apt.

Poniższe polecenia są typowe dla instalacji w nowszych wersjach (np. opartych na pakietach 8.x), ale mogą wymagać dostosowania do konkretnej dystrybucji i wersji systemu:

bash

sudo apt-get update
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt-get update
sudo apt-get install elasticsearch
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch

Elasticsearch Docker

Konteneryzacja z użyciem Dockera to popularny sposób na szybkie uruchomienie Elasticsearch w izolowanym środowisku.

Poniższy przykład wykorzystuje docker-compose do uruchomienia pojedynczego node’a.

Upewnij się, że masz zainstalowany Docker i Docker Compose.

docker-compose.yml

version: '3'
services:
elasticsearch:
image: elasticsearch:8.5.0
environment:
- discovery.type=single-node
ports:
- "9200:9200"

Aby uruchomić kontener, użyj polecenia w terminalu, w katalogu, gdzie zapisałeś powyższy plik (docker-compose.yaml):

terminal

docker-compose up -d

Komunikacja z Elasticsearch

Komunikacja z Elasticsearch odbywa się standardowo przez protokół HTTP i interfejs REST API.

Oznacza to, że możesz wysyłać zapytania do Elasticsearch za pomocą typowych metod HTTP (GET, PUT, POST, DELETE), podobnie jak komunikujesz się ze stronami internetowymi czy innymi usługami webowymi.

To sprawia, że integracja z aplikacjami w dowolnym języku programowania jest bardzo prosta. Oto kilka podstawowych przykładów takich zapytań:

  • GET /: To proste zapytanie pozwala sprawdzić, czy Twój klaster Elasticsearch działa poprawnie i uzyskać podstawowe informacje o jego statusie. Pomyśl o tym jak o “pingowaniu” Elasticsearch.
  • PUT /nazwa_indeksu: Używasz tej metody, aby utworzyć nowy indeks, czyli taką “kolekcję” na Twoje dokumenty. W miejscu nazwa_indeksu podajesz wybraną przez siebie nazwę.
  • POST /nazwa_indeksu/_doc: Za pomocą tej metody dodajesz nowy dokument do określonego indeksu. Treść dokumentu przesyłasz w formacie JSON w ciele zapytania. Elasticsearch automatycznie przypisze unikalny identyfikator do każdego dokumentu, jeśli go nie podasz/
  • GET /nazwa_indeksu/_search: To Twoje główne narzędzie do wyszukiwania danych w indeksie. W ciele zapytania POST lub w parametrach zapytania GET możesz zdefiniować, czego szukasz, stosując język zapytań Elasticsearch.
  • DELETE /nazwa_indeksu: Służy do usuwania całego indeksu wraz ze wszystkimi zawartymi w nim dokumentami.

Elasticsearch full text search

Jedną z najmocniejszych stron Elasticsearch jest jego zdolność do przeszukiwania pełnotekstowego.

Oznacza to, że Elasticsearch potrafi szukać słów i fraz w tekście w sposób “inteligentny”, wykraczający poza proste dopasowanie.

Wykorzystuje do tego różne zapytania, takie jak match, multi_match (do przeszukiwania wielu pól tekstowych jednocześnie) czy query_string. Kluczową rolę odgrywają tutaj analizatory.

Zanim tekst trafi do indeksu, jest on przetwarzany przez analizator, który dzieli go na mniejsze części (tokeny), usuwa stop-words (częste słowa typu “i”, “w”, “na”) i sprowadza słowa do formy podstawowej (lematyzacja/stemming).

Dzięki temu Elasticsearch potrafi:

  • Znaleźć dokumenty zawierające odmiany szukanego słowa (np. szukając “biegać” znajdzie “biega”, “biegający”).
  • Radzić sobie z błędami literowymi (tzw. fuzziness).
  • Rankingować wyniki, pokazując najbardziej trafne dokumenty na górze listy, co jest kluczowe w dobrych wyszukiwarkach.

Inverted index i Apache Lucene

Serce mechanizmu pełnotekstowego wyszukiwania w Elasticsearch bije dzięki strukturze danych zwanej odwróconym indeksem (inverted index).

To koncept wywodzący się z biblioteki Apache Lucene, na której bazuje Elasticsearch.

Elasticsearch Apache Lucene

Zamiast przeszukiwać dokumenty w poszukiwaniu słów (jak robią to tradycyjne bazy danych przy prostym wyszukiwaniu), odwrócony indeks działa na zasadzie: dla każdego słowa (tokenu) wie, w których dokumentach się ono pojawia.

Wyobraź sobie to tak: tradycyjny indeks książki mówi “w rozdziale 3 znajdziesz informacje o…” Odwrócony indeks mówi “słowo ‘komputer’ znajdziesz na stronach 15, 45, 102…”.

Apache Lucene buduje taki odwrócony indeks na poziomie każdego shard’a, czyli fragmentu Twoich danych.

Dzięki temu, gdy wysyłasz zapytanie o konkretne słowo, Elasticsearch może błyskawicznie sprawdzić w odwróconym indeksie, w których shard’ach (i dokumentach) to słowo występuje, co zapewnia bardzo szybkie wyszukiwanie, nawet w ogromnych zbiorach danych.

Elasticsearch to więcej niż tylko silnik wyszukiwania

Elasticsearch to więcej niż tylko silnik wyszukiwania – to kompleksowa platforma, która umożliwia Ci efektywne zarządzanie danymi, błyskawiczne wyszukiwanie i głęboką analizę, otwierając drzwi do nowych zastosowań biznesowych, od monitorowania systemów po personalizację doświadczeń użytkowników.

Jego skalowalna i odporna na awarie architektura, łatwa integracja przez REST API oraz potężne możliwości pełnotekstowego wyszukiwania sprawiają, że jest to narzędzie, które warto rozważyć w swoich projektach.

Niezależnie od tego, czy potrzebujesz rozwiązania do analizy logów, monitoringu, SIEM, czy zaawansowanego wyszukiwania w swojej aplikacji – Elasticsearch dostarcza narzędzia, które pomogą Ci osiągnąć Twoje cele i w pełni wykorzystać potencjał Twoich danych.

Sprawdź, jak Elasticsearch może usprawnić Twoje działanie!