Každé pole indexu má určitý datový typ, přičemž:
Nejpoužívanější datové typy, se kterými se budeme setkávat:
keyword: Text, ve kterém se nebude fulltextově vyhledávat - optimalizováno pro filtrování a agregacetext: Text určený pro fulltextové vyhledávánílong, integer: Celé číslodouble, float: Desetinné číslodate: Pole pro uložení data nebo času. Pokud chceme použít jiné, než předdefinované formátování (2019-01-01, 2019-01-01T12:10:30Z nebo 1420070400001), je třeba ho uvést při vytváření pole.boolean: Hodnoty true a falseobject, nested, join: Pomocí speciálních datových typů je možné uložit do Elasticsearch relaci mezi dokumentygeo_point, geo_shape: Uložení geografických datVeškeré podporované datové typy jsou specifikovány v dokumentaci.
Při ukládání dokumentů do Elasticsearch zároveň vznikají metadata obsahující informace o tom, jaké pole má jaký datový typ. Tomu se říká mapping a zobrazit si jej lze pomocí endpointu _mapping:
xxxxxxxxxxPOST product/_doc{ "code": "APP549396996", "name": "iPhone 13 128GB Midnight", "description": "iPhone 13. The most advanced dual-camera system ever on iPhone. Lightning-fast A15 Bionic chip. A big leap in battery life. Durable design. Superfast 5G. 1 And a brighter Super Retina XDR display.", "price": 799.99, "category": "Electronics", "stock": true}
GET product
V příkladu výše je mapování vytvořeno automaticky na základě ukládaných dat.
Nicméně ne vždy je Elasticsearch schopný správně detekovat datové typy. Například pole code detekované jako text nebude pravděpodobně využito pro fulltextové hledání, takže by vhodným type bylo spíše keyword. V tomto případě je nutné mapování definovat předem. Vytvořme tedy nový prázdný index s správným mapováním:
xxxxxxxxxxPUT product-2{ "mappings": { "properties": { "code": { // <= název pole "type": "keyword" // <= datový typ } } }, // volitelně lze také uvést nastavení indexu: "settings": { "number_of_replicas": 0 }}Následně lze přidat dokument do tohoto indexu:
xxxxxxxxxxPOST product-2/_doc{ "code": "APP549396996", "name": "iPhone 13 128GB Midnight", "description": "iPhone 13. The most advanced dual-camera system ever on iPhone. Lightning-fast A15 Bionic chip. A big leap in battery life. Durable design. Superfast 5G. 1 And a brighter Super Retina XDR display.", "price": 799.99, "category": "Electronics", "stock": true}Nyní při zobrazení mapování pomocí endpointu _mapping:

Nová pole mohou být do mapování přidána pomocí endpointu _mapping Nová pole budou dostupná pod klíčem properties:
xxxxxxxxxxPUT product-2/_mapping{ "properties": { "rating": { "type": "half_float" } }}
Při ukládání dokumentů do Elasticsearch musí všechna pole dodržovat existující nastavení. V příkladu výše jsme nastavili pole rating jako číslo pomocí typu half_float. Pokud se ale pokusíme uložit text do pole rating:
xxxxxxxxxxPOST product-2/_doc{ "name": "OEM 4K HDMI Cable for TV", "rating": "UNKNOWN"}
Request skončí s chybou.
Občas je nutné jedno pole ukládat více způsoby.
Například si představme výrobce produkt. Ten bude využit pro fulltextové vyhledávání (takže bude typu text). Ale v případě, že bychom chtěli vypsat všechny dostupné výrobce pomocí agregací (které spolupracují s neanalyzovanými poli), bude třeba použít typ keyword.
V tomto případě by mapování vypadalo následovně:
xxxxxxxxxxPUT product-3{ "mappings": { "properties": { "name": { "type": "text", "fields": { "keyword": { "type": "keyword" } } } } }}
Pokud nechcete specifikovat mapování pro každé pole zvlášť, lze využít dynamic_templates.
Takto by například vypadalo pravidlo, které vždy uloží string jako keyword:
xxxxxxxxxxPUT my_logs-2022.02.09{ "mappings": { "dynamic_templates": [ { "strings": { "match_mapping_type": "string", "mapping": { "type": "keyword" } } } ] }}
Šablony Elasticsearch obecně umožňují nastavit pravidla, která se použijí při splnění určitých podmínek. Například index templates definují nastavení indexů a mapování pro nově vytvořené indexy (pokud jejich názvy odpovídají vzoru).
To je užitečné při vytváření denních indexů se stejným nastavením (což je typické pro Logstash).
Řekněme, že každý nově vytvořený index s názvem začínajícím na test by neměl mít žádné replika shards, protože není určen pro produkční použití. Toho dosáhneme vytvořením šablony:
xxxxxxxxxxPUT _index_template/test_no_replicas{ "index_patterns": ["test*"], "template": { "settings": { "number_of_replicas": 0 } }}Nyní, pokud vytvoříte index test_123, neměl by mít žádné repliky. Ale pokud vytvoříte index 123_test Měl by mít defaultní nastavení.

Index templates mohou být také vytvořeny v Kibana UI: Stack Management > Index Management > Index Templates. Po kliknutí na Create template se zobrazí průvodce:

Zvolte název a index pattern:

Pokud chcete použít "Component templates" (znovupoužitelné bloky šablon), můžete je vybrat v druhém kroku.
Ve třetím kroku uveďte JSON reprezentující nastavení indexu:

Ve čtvrtém kroku lze definovat mappings. Například pro pole uuid, které bude typu keyword:

V pátém kroku lze indexu přiřadit alias
V posledním kroku si můžete zkontrolovat request, který bude následně spuštěn:

Vytvořte index template nazvanou comments, která bude používat následující mappings pro index nazvaný comments (index bude vytvořen v následujícím kroku):
| Field | Type |
|---|---|
| title | text |
| text | text |
| author | text + keyword |
| keyword | |
| visible | boolean |
| score | decimal number |
| created | date accepting only format yyyy-MM-dd |
Uložte následující dokument do indexu comments:
xxxxxxxxxx{ "title": "Test comment", "text": "Hello world!", "author": "Hicham Sharp", "email": "hicham@sharp-family.zzz", "visible": true, "score": 12.7, "created": "2022-02-18"}Nyní zkontrolujte mapování indexu comments. Mělo by odpovídat požadavkům z prvního kroku.