オリジナルサイト:ESのAPIシリーズ -- ダイナミックテンプレート(ダイナミックテンプレート)の使い方(例あり)
序章
例証する
この記事では、エラスティックサーチの動的テンプレート(動的テンプレート)の使い方を(例を交えて)紹介しています。
公式サイトURL
https://www.elastic.co/guide/en/elasticsearch/reference/8.0/dynamic-templates.html
動的テンプレートの役割
機能概要
動的テンプレートは、特定のインデックスに対して設定されます。つまり、特定のインデックスを作成するときに指定されます。
使用シーン
フィールド タイプを自動的に識別する ES の機能に従って、いくつかの特別なフィールドの名前を特定のタイプに設定します。例えば:
- 文字列型のすべてのフィールドをキーワードに設定
- is で始まる文字列はすべてブール型に設定されます
マッチマッピングタイプ
概要
_mapping が設定されていない場合、ES はドキュメント フィールドのタイプに応じて動的マッピングを実行します。このように、ES データ型は JSON データ型に対して動的に定義されます。
JSON データ型 |
ES データ型 |
ヌル |
フィールドを追加しない |
真/偽 |
ブール値 |
ダブル |
浮く |
長さ |
長さ |
物体 |
物体 |
配列 |
配列内の最初の null 以外の値の型に応じて |
日付検出を渡す文字列 |
日にち |
数値検出を渡す文字列 |
フロートまたはロング |
上記の 2 つのテストに合格しなかった文字列 |
.keyword サブフィールドを含むテキスト タイプ |
例
PUT /es-learn-doc-person/_create/1
{
"name":"zhang san",
"age":29
}
動的マッピングでのマッピング:
{
"es-learn-doc-person" : {
"mappings" : {
"properties" : {
"age" : {
"type" : "long"
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
このドキュメントでは、age は自動的に long にマップされますが、整数型は現在のデータのストレージを完全に満たしています。このようなシナリオを想定すると、会社のデータの整数値部分については、ほとんどの整数がストレージ要件を満たすことができ、ダイナミック テンプレートを使用して動的にマッピングできます。方法は次のとおりです。
PUT es-learn-000002
{
"mappings": {
"dynamic_templates": [
{
"integers": {
"match_mapping_type": "long",
"mapping": {
"type": "integer"
}
}
}
]
}
}
インデックス es-learn-000002 で使用される動的テンプレートには、同じユーザー情報を挿入します。
PUT es-learn-000002/_doc/1
{
"name":"zhang san",
"age":29
}
対応するマッピングを表示する
一致と不一致
概要
match と unmatch は、フィールド名を一致させることです。
ネストされたオブジェクトの場合、一致および不一致は、フィールド名の最後のレベルでのみ機能します。
- 一致: フィールド名はルールに一致します
- unmatch : フィールド名がルールに一致しません
- match_pattern: マッチングに使用されるパターン。regex に設定すると、一致および不一致で正規表現がサポートされます。例えば:
"match_pattern": "regex", "match": "^profit_\d+$"
例
必要
- 文字列型のすべてのフィールドをキーワードに設定
- is で始まる文字列はすべてブール型に設定されます
方法
PUT my_index
{
"mappings": {
"dynamic_templates": [{
"strings_as_boolean": {
"match_mapping_type": "string",
"match": "is*",
"mapping": {
"type": "boolean"
}
}
}, {
"strings_as_keywords": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
]
}
}
path_match と path_unmatch
概要
match と unmatch は、最後のレベルのフィールド名でのみ機能します. 多層埋め込みオブジェクトの場合、path_match と path_unmatch を使用できます. (ES はオブジェクトの格納をサポートしています)。例: some_object.*.some_field。
例
値がオブジェクト タイプの場合、name で始まり middle で終わらない場合は、それを full_name フィールドにコピーします。
マッピングを設定:
PUT my_index
{
"mappings": {
"dynamic_templates": [
{
"full_name": {
"path_match": "name.*",
"path_unmatch": "*.middle",
"mapping": {
"type": "text",
"copy_to": "full_name"
}
}
}
]
}
}
データを挿入する
PUT my_index/_doc/1
{
"name": {
"first": "John",
"middle": "Winston",
"last": "Lennon"
}
}
データを見る
GET my_index/_search?q=full_name:John
インデックス テンプレートと動的テンプレートの組み合わせ
ここでは試していませんが、インデックス テンプレートと動的テンプレートを同時に使用できると思います。次に例を示します。
PUT _index_template/event_log_template
{
"index_patterns": ["event_log_*"],
"template": {
"settings": {
"number_of_shards": 5,
"number_of_shards": 1
},
"mappings": {
"dynamic_templates": [{
"dynamicFields": {
"match_mapping_type": "string",
"path_match": "dynamicFields.*_sku_attr",
"mapping": {
"type": "keyword"
}
}
}
],
"properties": {
"id": {
"type": "keyword"
},
"category_first_id": {
"type": "keyword"
},
"category_first": {
"type": "keyword"
}
}
}
}
}