03 - Cluster, SQL, CRUD operace

 

Kibana

Pokud bychom měli Elasticsearch spuštěný lokálně, nejjednodušší request by vypadal následovně:

Vzhledem k tomu, že budeme ke spuštění dotazů používat Kibanu, není nutné zadávat adresu Elasticsearch. Ta je již nastavena v konfiguraci Kibany. Stejný request jako výše bude mít v Kibaně následující podobu:

Dotaz spustíme šipkou vedle dotazu, výsledek se objeví v pravé části okna:

kibana-basic-get

Kromě toho lze příkaz spustit klávesovou zkratkou ctrl + enter (respektive cmd + enter na Apple). Je také možné nechat kód přeformátovat kliknutím na tři tečky a možnost Auto indent.

 

Prozkoumávání clusteru

Prvním příkazem, kterým lze zjistit stav celého clusteru je odeslání GET requestu na endpoint _cat/health?v (počáteční lomítko můžeme z dotazu vynechat). Zjistíte tak název a status clusteru (tedy stav všech shardů v clusteru). Pokud je vše v pořádku, status je green. Pokud existují shardy, které není možné přiřadit na žádný node (například pokud lokálně nastavíte počet replik větší než 1), bude status yellow. Pokud nejsou některá data vůbec dostupná, bude status red.

image-20220122162719397

Alternativně lze stav clusteru vypsat i v formátu JSON: GET _cluster/health

Cluster se skládá z nodů, vypsat je lze příkazem GET _cat/nodes?v:

image-20220122163020704

Dále budeme pracovat s indexy, jejichž seznam je možné získat requestem GET _cat/indices?v. V cloudu jsou předvytvořené především systémové indexy začínající tečkou. Je zde také index s vzorovými daty:

image-20220122163216395

Endpointy _cat jsou užitečné při zkoumání stavu clusteru. Pokud byste je ale chtěli použít ve skriptech nebo automatizaci, bude lepší použít strojově čitelné varianty vracející JSON, jako _cluster/health, _cluster/stats, _nodes nebo _nodes/stats.

 

SQL

Přestože je primárním způsobem komunikace s Elasticsearch odesíláni JSON dokumentů pomocí REST rozhraní, je možné použít i SQL. Jeho možnosti jsou v Elasticsearch omezené, pokud ale neznáte Elasticsearch query language, může být právě SQL rychlým způsobem, jak s Elasticsearch.

K dispozici je CLI nástroj, který ve staženém Elasticsearch spustíte příkazem:

Následně se spustí konzole, do které je možné SQL příkazy zadávat.

V rámci Kibany je nutné SQL příkaz zabalit do JSON dokumentu:

Při použití formátu txt se tento výsledek vyhledávání ve vzorových datech zobrazí v tabulce:

image-20220122163932572

Podpora SQL umožňuje Elasticsearch napojit (pomocí JDBC respektive ODBC knihovny) na další nástroje, například MS Excel nebo Tableau. Dá se také využít k učení se Elasticsearch query language. Každý SQL dotaz je totiž interně transformován na Elasticsearch query a tu si můžeme nechat zobrazit:

Použití SQL má však své limity, především je použitelné jen pro získávání dat, ne pro jejich změnu. Dále je problematické použití s některými datovými typy, především s vnořenými objekty a poli.

 

Vytvoření dokumentu

Nový dokument do Elasticsearch uložíme následujícím příkazem:

V tomto requestu user značí název indexu, do kterého bude dokument uložen, 1 je jednoznačný identifikátor dokumentu a {"name": "Oliver Johnson"} je samotný dokument.

Všimněte si, že jsme nikde nedefinovaly, jaká pole bude dokument obsahovat. To je rozdíl oproti RDBMS, kde je nutné všechny sloupce tabulky předem definovat. V Elasticsearch můžeme rovnou dokument vytvořit, není třeba předem definovat, jaké pole bude obsahovat.

Pokud bychom tento dokument uložili znovu, původní se celý přepíše. Pokud neznáme ID, můžeme nechat Elasticsearch vygenerovat UUID, které dokumentu přidělí, pak také nikdy nedojde k přepsání stávajícího dokumentu:

Druhý přístup se v praxi využívá u dat, kderá už zpravidla nebude třeba nijak modifikovat, nebo ID vůbec nevíme - například u logů. V Kibaně se v tomto případě setkáte s pojmenováním Data Streams. Používat ID má naopak smysl například při ukládání produktů nebo zákazníků.

V případě, že by dosud index user neexistoval, automaticky se vytvoří. A pokud existuje šablona odpovídající názvu nového indexu, převezme z ní nově vytvářený index nastavení.

Po vytvoření dokumentu obdržíme response, která obsahuje výsledek, zda se dokument podařilo uložit, do jakého indexu a s jakým ID. Zároveň je vidět jeho verze, tedy zda došlo k prvnímu uložení dokumentu s daným ID, nějakému dalšímu.

Dev_Tools_-_Elastic_and_indices_překlad_z_češtiny_do_angličtiny_–_Seznam_Slovník-3923435

 

Získání dokumentu

Pokud známe index a ID dokumentu, je možné jej dohledat pomocí příkazu:

V response je dokument dostupný pod klíčem _source:

Dev_Tools_-_Elastic-3923594

Přestože jsou dokumenty v Elasticsearch vyhledatelné až po nějaké době (standardně 1s), pro request s ID platí, že je dokument dostupný ihned.

Pokud chcete získat dokument přesně tak, jak byl uložen (obsah klíče _source), je to možné dotazem:

 

Výpis dokumentů

Pro zobrazení všech dokumentů v indexu slouží následující dotaz:

Je možné název indexu kompletně vynechat, pak se bude vyhledávat ve všech indexech v clusteru. V názvu indexu je také možné použít *, což značí libovolné znaky. Pokud bychom chtěli vyhledat ve všech indexech začínajících písmenem u, vypadalo by to následovně:

Dev_Tools_-_Elastic-3924920

Tento endpoint budeme používat pro vyhledávání. Narozdíl od získání dokumentu dle ID obsahuje response více informací:

Počet nalezených dokumentů v hits.hits je ve výchozím stavu omezen na 10 záznamů. Počet v hits.total odpovídá celkovému počtu dokumentů, které odpovídají dotazu, což nemusí odpovídat počtu dokumentů v hits.hits.

Maximální počet nalezených záznamů v hits.total je z výkonostních důvodů omezen na 10.000. Pokud je v indexu více dokumentů a chceme znát přesný počet nalezených záznamů, je třeba upravit vyhledávací dotaz:

 

Modifikace dokumentu

Nejjednodušším způsobem modifikace dokumentu je jeho nahrazení novější verzí. Je k tomu nutné ukládat dokument se shodným ID:

Je však možné i aktualizovat pouze konkrétní pole dokumentu. Nejprve vytvoříme nový dokument:

Pokud bychom chtěli nyní změnit pouze věk uživatele s ID 4, bylo by to možné takto:

Dev_Tools_-_Elastic-3925693

Pomocí endpointu _update je možné vytvořit nebo upravit pole existujícího dokumentu.

Pokud potřebujete k aktualizaci dokumentu využít stávající hodnoty (například zvýšení věku uživatele o 2), bute nutné využít skript:

Samotný skript využívá jazyk painless, který poskytuje proměnné, podmínky nebo cykly. Stávající hodnoty dokumentu jsou dostupné pod ctx._source.

 

Mazání dokumentu

Dokument se maže uvedením stejné URL, jako kdybychom chtěli přidat nový dokument podle ID, pouze se použije HTTP metoda DELETE:

 

Úkol: CRUD

  1. Vytvořte následující dokumenty v indexu subscription_list:

  2. vypište všechny dokumenty v indexu subscription_list

    Dev_Tools_-_Elastic-3926546

  3. Změňte e-mailovou adresu prvního zákazníka na first@outlook.com a zobrazte výsledek:

    Dev_Tools_-_Elastic-3926909

  4. Smažte druhého zákazníka a znovu vypiště všechny dokumenty v indexu subscription_list:

Dev_Tools_-_Elastic-3927164