Elasticsearch

9 artykułów

Relacje w ElasticSearch ( parent – child )

W relacyjnych bazach danych tworzenie relacji jest naturalnym sposobem odwzorowywania rzeczywistości. Jednak w przypadku, gdy mamy odczynienia z wyszukiwarką opartą o nierelacyjną bazę danych sprawy nieco się komplikują.

10 lut 2020

Migracja serwera ElasticSearch na nowszą wersję z wykorzystaniem _reindex

ElasticSearch rozwija się bardzo dynamicznie w związku z czym możemy zaobserwować dość częste wydawanie nowej wersje silnika. I pojawia się pytanie, czy aktualizować ? Osobiście chętnie aktualizuję, czy to ElasticSearch-a, czy też frameworki na których pracuję. Wyznaję przy tym kilka zasad, jedna z nich to stabilność działania. Dlatego w tym wpisie pokażę, jak w prosty sposób przenieść nasze indeksy do nowszej wersji ElasticSearch-a wykorzystując _reindex.

9 maj 2019

Obsługa języków w ElasticSearch

Tworząc wyszukiwarkę o wysokim poziomie trafności, musimy wziąć pod uwagę obsługę języka. A jak wiemy nasz język do najłatwiejszych nie należy. Sam silnik wyszukiwania także nie wspiera naszego języka, ale pokażę Ci jak pomimo tych przeszkód poradzić sobie z obsługą języka polskiego.

9 sty 2019

Sposoby wyszukiwania w ElasticSearch

W pierwszym wpisie tej serii opisałem jak konstruować proste zapytania wyszukujące. Był to zaledwie przedsmak tego co można zrobić w ElasticSearch. Tym razem poszerzymy wiedzę o najczęściej wykorzystywane sposoby wyszukiwania oraz zobaczymy jakie problemy poszczególne sposoby rozwiązują.

4 wrz 2018

Wprowadzenie do agregacji danych w ElasticSearch

Oprócz zaawansowanego wyszukiwanie pełnotekstowego w ElasticSearch mamy także możliwość grupowania i zliczania dokumentów. Co ważne operacje zliczania mogą być wykonywane równolegle z operacjami przeszukiwania indeksu. Dzięki czemu możemy zmniejszyć ilość zapytań do wyszukiwarki.

3 kwi 2018

Mapping dokumentów w ElasticSearch

Jeśli mieliście kontakt z relacyjnymi bazami danych (MySQL, MSSQL, PostgreSQL) to przyzwyczaiły was one do definiowania schematów bazy danych. W takim schemacie bazę dzielimy na tabele, tabele na kolumny, którym z kolei przypisujemy określony typy danych. Odpowiednikiem tego podejścia jest mapping w ElasticSearch.

4 lut 2018

Jak stworzyć własny analizer w ElasticSearch

W przypadku, gdy żaden z wbudowanych analizer-ów nie spełnia naszych wymagań. ElasticSearch daje nam możliwość zbudowania własnych. Jednak jeśli mamy już stworzony indeks to dodanie nowego analizer-a wymaga odrobiny gimnastyki.

23 sty 2018

Jak ElasticSearch analizuje dane przed dodaniem ich do indeksu

Podczas operacji wprowadzania danych czyli indeksacji, dane są analizowane przez mechanizm, który nazywa się analizerem. Elasticsearch dostarcza nam zestaw wbudowanych analizerów, które w większości przypadków będą wystarczające.

19 paź 2017

Wprowadzenie do Elasticsearch

Niezależnie od języka w jakim piszemy aplikacje prędzej czy później możemy się spotkać z koniecznością przeszukiwania dużych ilości danych. Z reguły przeszukiwanie to ma być “inteligentne” czyli pozwalać na drobne błędy w pisowni oraz uwzględniać odmiany słów. Jak już zapewne część z was się domyśliła chodzi mi o wyszukiwanie pełnotekstowe.

19 sie 2017

Migracja serwera ElasticSearch na nowszą wersję z wykorzystaniem _reindex

ElasticSearch rozwija się bardzo dynamicznie w związku z czym możemy zaobserwować dość częste wydawanie nowej wersje silnika. I pojawia się pytanie, czy aktualizować ? Osobiście chętnie aktualizuję, czy to ElasticSearch-a, czy też frameworki na których pracuję. Wyznaję przy tym kilka zasad, jedna z nich to stabilność działania. Dlatego w tym wpisie pokażę, jak w prosty sposób przenieść nasze indeksy do nowszej wersji ElasticSearch-a wykorzystując _reindex.

Dla nielubiących czytać ;) Poniżej zamieszczam filmik pokazujący jak przeprowadzić proces przenosin pomiędzy wersją 6.2 do 6.7.

Zanim przejdziemy do samego procesu musimy wiedzieć, że przed rozpoczęciem konieczne jest stworzenie indeksu do którego zostaną przeniesione dane na nowym serwerze. Najlepiej gdy indeks zawiera ten sam mapping oraz ustawienia. W innym przypadku mogą wystąpić błędy.

Rozważając opcję migracji należy zwrócić uwagę na wersję pomiędzy którymi planujemy wykonywać migrację. W tym przypadku będziemy robili migrację w ramach wersji 6.x. Oczywiście możliwe są migracje pomiędzy wersjami 5.x -> 6.x czy 6.x -> 7.x. Takie migracje wymagać mogą modyfikacji mappingu czy ustawień, dlatego skupimy się na najprostszej opcji czyli migracja w ramach tej samej wersji głównej.

Na starym serwerze znajdują się nasze indeksy i wszystkie dane. Na nowym serwerze tworzymy indeksy wraz z mappingiem i ustawieniami zgodnymi z tymi ze starego serwera.

W konfiguracji nowego serwera dodajemy adres starego serwer do białej listy. Robimy to dodając do pliku elasticsearch.yml poniższy wpis ( sam plik znajdziemy w lokalizacji: /etc/elasticsearch/elasticsearch.yml).

reindex.remote.whitelist: stary:9200

Zamiast stary wpisujemy adres IP naszego serwera ;) Po zmianach w pliku restartujemy serwer ElasticSearch i możemy przystąpić do uruchomienia procesu reindeksacji.

_reindex

Wchodzimy do Kibany na nowym serwerze lub konsoli i przesyłamy poniższe polecenie.

POST _reindex?wait_for_completion=false
{
  "source": {
    "remote": {
      "host": "http://stary:9200"
    },
    "index": "indeks_a"
  },
  "dest": {
    "index": "indeks_a"
  }
}

Zaczynając od samego początku. Opcja reindeksacji jest dostępna pod adresem _reindex. Po adresie został dodany parametr wait_for_completion ustawiony na wartość false, co oznacza że nie chcemy czekać na zakończenie polecenia i jego rezultat. Gdybym z tej opcji zrezygnowali to czekali byśmy na zakończenie wykonywania całego procesu. W zależności od wielkości indeksu i wydajności maszyny oczekiwanie może zająć różny okres czasu. A najprawdopodobniej po 30 sekundach proces zostanie zakończony, a my zobaczymy błąd. Jest to ograniczenie Kibany, które możemy zmienić w ustawieniach. Pytanie tylko po co skoro mamy inną opcję. Dlatego zalecam pozostawienie parametru i obserwowanie poziomu jego wykonania przez API zadań o czym opowiem za chwilę.

W ciele polecenia znajdują się dwa istotne obiekty source oraz dest.

source

Obiekt definiuje źródło z którego mają być pobierane dane. Znajdziemy tam obiekt remote w którym pod parametrem host został wpisany adres serwera źródłowego.

"source": {
  "remote": {
    "host": "http://stary:9200"
  },
  "index": "indeks_a"
}

Mamy także parametr index, gdzie podajemy nazwę indeksu, który chcemy przenieść.

dest

Drugim obiektem, jest obiekt dest. Definiuje on gdzie należy dane przenieść. W parametrze index podajemy nazwę indeksu, w tym przypadku mamy taką samą nazwę indeksu, co oczywiście nie jest wymogiem.

"dest": {
  "index": "indeks_a"
}

Proces reindeksacji

Po wykonaniu przedstawionego polecenia z opcją wait_for_completion ustawioną na false. Zostanie nam zwrócony identyfikator zadania uruchomionego w tle.

Mając taki identyfikator jesteśmy w stanie odwołać się do niego wykorzystując API ElasticSearch. I dowiedzieć jak wygląda status wykonywanego zadania.

GET _tasks/xF0lhlBgTRSjH4dFYLmLTA:39842

Zapytanie to powinno zwrócić nam informację o zadaniu na podstawie podanego identyfikatora.

Najważniejsza jest dla nas informacja, czy zadanie zostało zakończone. Informację tą znajdziemy pod kluczem completed, gdy wartość zostanie zmieniona na true to indeks został przeniesiony.

Dodatkowe informacje o stanie przenosin danych pomiędzy indeksami znajdziemy w obiekcie znajdującym się pod kluczem status. Mamy tam informację o ilości dokumentów, klucz total. Oraz pod kluczami updated, created, deleted znajdziemy informację o ilościach wykonanych poszczególnych operacji w ramach reindeksacji.

Warto także rzucić okiem na klucz description, który opisowo pokazuje polecenie jakie jest wykonywane.

Podsumowanie

Powyższy proces jest najprostszym przypadkiem przenoszenia indeksu pomiędzy starą i nową instalacją ElasticSearch. Oczywiście nie jedyną, ale w wielu przypadkach najprostszą i najszybszą.

Zaletą tego rozwiązania jest możliwość bardzo łatwego sprawdzenia czy po aktualizacji do nowszej wersji wszystkie nasze aplikację będą działały bez problemu z nową wersją ElasticSearch.

Drobną wadą jest konieczność tworzenia indeksu i przenoszenia mappingu, ustawień do nowej maszyny. Choć jestem w stanie sobie wyobrazić, że tę część wykonuje za nas nasza aplikacja ;)