05 - Práce s indexy, hromadné operace

 

Vytvoření indexu

Vytvořit index je možné ještě před tím, než do něj uložíme data - HTTP metodou PUT následovanou názvem indexu. Pokud poté vypíšeme seznam indexů, měl by na něm přibýt nově vytvořený index:

Dev_Tools_-_Elastic-4431551

Při vytváření indexu můžeme indexu přidat různé nastavení. Například lze definovat počet shardů pomocí number_of_shards respektive number_of_replicas. Pokud se však nyní pokusíte znovu vytvořit index users, operace skončí chybou, protože takto nazvaný index již existuje. Jednou z možností je jej smazat (použít HTTP metodu DELETE), čímž také dojde ke smazání veškerého obsahu indexu:

Pokud chceme pouze změnit počet replik existujícího indexu, je to možné provést i po vytvoření indexu následujícím příkazem:

Nastavení indexů je možné měnit také skrz grafické rozhraní - v Kibaně pod Stack Management > Data > Index Management stačí zvolit daný index a nastavení změnit:

Index_Management_-_Elastic-4451870

 

Bulk API - hromadné operace

Operace s dokumenty nemusíme provádět po jednom requestu na dokument, je možné využít _bulk api, které umí v rámci jednoho requestu zpracovat několik operací. Slouží k tomu endpoint _bulk, před kterým je uveden název indexu. Vstupní data jsou zadávána tak, že na každém řádku je jedna požadovaná operace nebo dokument.

Kromě ukládání dokumentů je možné je hromadně upravovat a mazat:

Jde o efektivní způsob, jak do Elasticsearch uložit větší množství dat, protože se minimalizuje počet navazování spojení po síti. Pokud některá dílčí operace skončí chybou, neznamená to ještě chybu celého requestu - v response se dozvíme, kolik dílčích operací skončilo (ne)úspěšně.

 

Modifikace a mazání více dokumentů

Dalším způsobem modifikace dokumentů je využití Update by query API, které vyžaduje zapsaný skript popisující logiku změny jednotlivého dokumentu:

Ke smazání některých dokumentů v rámci indexu lze využít Delete by query API. Zde je nutné uvést query, která určí, které dokumenty mají být smazány:

 

Reindexace

Index obsahuje několik konfigurací, které není možné po jeho vytvoření změnit. Problém nastává i ve chvíli, kdy do indexu uložíme dokument, jehož pole se uloží jako jeden datový typ (například text), ale později zjistíme, že by měl mít jiný datový typ (například datum) a již není možné jej změnit.

Pokud chceme takovou úpravu provést v rámci Elasticsearch, je nutné nejprve ručně vytvořit nový index se správným nastavením a následně zkopírovat pomocí reindexace data z původního indexu do nového. Pro tuto operaci je k dispozici endpoint _reindex:

Tento endpoint budeme využívat při změnách v nastavení indexu souvisejících s vyhledáváním. Je možné jej využít i ve specifičtějších případech, kdy chceme přeindexovat jen část dokumentů, nebo naopak dostat dokumenty z více indexů do jednoho. V neposlední řadě je možné jej použít pro přenos dat mezi různými clustery, například ze staging prostředí do lokálního.

Při reindexaci se pouze přenáší data, nepřenáší se nastavení indexu jako je počet shardů, replik, nebo mapping. Pokud tedy chceme, aby měl nově vytvářený index nějaké jiné nastavení, než výchozí, je třeba nejprve vytvořit index s požadovaným nastavením a následně do něj data reindexovat.

 

Aliasy

V praxi dochází ke změnám v nastavení indexu a následné reindexaci, než ale tyto operace proběhnou, nemůžeme si často dovolit mít index jen částečně funkční, obsahující neúplná data. Pro tento účel je možné využít aliasu, kdy lze jednomu indexu přiřadit alternativní název, pod kterým je dostupný.

Předpokládejme, že data jsou uložena v indexu user_v1, ale došlo k změně v nastavení indexu a je tak třeba vytvořit nový index user_v2 a nakopírovat do něj stávající data. Můžeme si vytvořit alias, který user, který bude směrovat vždy na aktuální index:

Tato operace je atomická, takže není třeba se obávat, že by byla data nějakou dobu nedostupná.

 

Práce s více indexy

Při vyhledávání v Elasticsearch můžeme specifikovat, ve kterých indexech se má vyhledávat. Dosud jsme vždy uváděli právě jeden index, ale můžeme jich vyjmenovat více (a oddělit názvy čárkou):

Dále můžeme použít znak *, který zastoupí libovolné znaky v libovolném počtu. Již jsme jej využili při vytváření sablony, stejně jej můžeme využít pro vyhledávání napříč všemi indexy v Elasticsearch:

Často se znak * používá u indexů, které mají společný prefix. Předpokládejme indexy s objednávkami, přičemž každý rok se vytváří nový index - order-2018, order-2019, order-2020. Pokud bychom chtěli vyhledávat ve všech těchto indexech, bylo by to možné takto:

Toho lze využít i při vytváření index pattern v Kibaně:

Pasted_Image_11_02_2022_1_49

 

Smazání indexu

Smazáním indexu dojde také ke smazání všech dokumentů a veškerého nastavení, které obsahuje. V requestu stačí uvést název indexu:

Alternativně je možné smazat index prostřednictvím grafického rozhraní Kibany:

Pasted_Image_11_02_2022_1_51

 

 

 

Úkol: Indexy, aliasy, reindexace

  1. Vytvořte dokument v indexu manufacturer s ID 1 a atributy:

    1. name: Apple

    2. revenue: 274515

    3. country: United States

  2. Vytvořte další dokument v indexu manufacturer - ID tentokrát nechte vygenerovat Elasticsearch:

    1. name: Toyota Group

    2. revenue: 256721

    3. country: Japan

Nyní si představte, že se výrazně zvýšilo vytížení indexu a je nutné mu nastavit více shardů.

  1. Vytvořte nový prázdný index manufacturer-2 s nastavením:

    1. Počet primary shards (number_of_shards): 5

    2. Počet replica shards number_of_replicas: 1

  2. Reindexujte data z indexu manufacturer do manufacturer-2

  3. Smažte index manufacturer

  4. Vytvořte alias manufacturer, který směřuje do indexu manufacturer-2

  5. Vypište všechny dokumenty v manufacturer:

Dev_Tools_-_Elastic-5288049