インデックステンプレート
このトピックでは、Elasticsearch 7.8で導入されたコンポーザブルインデックステンプレートについて説明します。以前のインデックステンプレートの動作については、レガシーテンプレートのドキュメントを参照してください。
インデックステンプレートは、インデックスが作成されるときにElasticsearchにインデックスをどのように構成するかを指示する方法です。データストリームの場合、インデックステンプレートは、ストリームのバックインデックスが作成されるときにそれを構成します。テンプレートはインデックス作成の前に構成されます。インデックスが手動で作成されるか、ドキュメントをインデックスすることによって作成されるとき、テンプレートの設定がインデックス作成の基礎として使用されます。
テンプレートには2種類あります:インデックステンプレートとコンポーネントテンプレート。コンポーネントテンプレートは、マッピング、設定、およびエイリアスを構成する再利用可能なビルディングブロックです。コンポーネントテンプレートを使用してインデックステンプレートを構築できますが、特定のインデックスセットに直接適用されることはありません。インデックステンプレートは、コンポーネントテンプレートのコレクションを含むことができ、設定、マッピング、およびエイリアスを直接指定することもできます。
インデックステンプレートには以下の条件が適用されます:
- コンポーザブルテンプレートはレガシーテンプレートよりも優先されます。特定のインデックスに一致するコンポーザブルテンプレートがない場合、レガシーテンプレートが一致して適用される可能性があります。
- 明示的な設定でインデックスが作成され、インデックステンプレートにも一致する場合、インデックス作成リクエストの設定がインデックステンプレートおよびそのコンポーネントテンプレートで指定された設定よりも優先されます。
- インデックステンプレート自体で指定された設定は、そのコンポーネントテンプレートの設定よりも優先されます。
新しいデータストリームまたはインデックスが複数のインデックステンプレートに一致する場合、最も優先度の高いインデックステンプレートが使用されます。
インデックスパターンの衝突を避ける
Elasticsearchには、以下のインデックスパターンに対して優先度100
の組み込みインデックステンプレートがあります:
logs-*-*
metrics-*-*
synthetics-*-*
profiling-*
Elastic Agentは、これらのテンプレートを使用してデータストリームを作成します。Fleet統合によって作成されたインデックステンプレートは、類似の重複インデックスパターンを使用し、優先度は200
までです。
FleetまたはElastic Agentを使用する場合、これらのテンプレートを上書きしないように、インデックステンプレートに100
よりも低い優先度を割り当ててください。そうでない場合、テンプレートを誤って適用しないように、次のいずれかを行ってください:
- すべての組み込みインデックスおよびコンポーネントテンプレートを無効にするには、
stack.templates.enabled
をfalse
に設定します。クラスタ更新設定APIを使用します。 - 重複しないインデックスパターンを使用します。
- 重複パターンを持つテンプレートに
priority
を200
よりも高く割り当てます。たとえば、FleetまたはElastic Agentを使用せず、logs-*
インデックスパターンのテンプレートを作成したい場合、テンプレートに500
の優先度を割り当てます。これにより、logs-*-*
の組み込みテンプレートの代わりにテンプレートが適用されます。 - 組み込みおよびFleet管理インデックステンプレートとの名前の衝突を避けるために、独自のインデックステンプレートの名前の一部として
@
を使用しないでください。
インデックステンプレートの作成
インデックステンプレートを作成および更新するには、インデックステンプレートおよびコンポーネントテンプレートを配置するAPIを使用します。また、Kibanaのスタック管理からインデックステンプレートを管理することもできます。
以下のリクエストは、2つのコンポーネントテンプレートを作成します。
Python
resp = client.cluster.put_component_template(
name="component_template1",
template={
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
}
}
}
},
)
print(resp)
resp1 = client.cluster.put_component_template(
name="runtime_component_template",
template={
"mappings": {
"runtime": {
"day_of_week": {
"type": "keyword",
"script": {
"source": "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ENGLISH))"
}
}
}
}
},
)
print(resp1)
Js
const response = await client.cluster.putComponentTemplate({
name: "component_template1",
template: {
mappings: {
properties: {
"@timestamp": {
type: "date",
},
},
},
},
});
console.log(response);
const response1 = await client.cluster.putComponentTemplate({
name: "runtime_component_template",
template: {
mappings: {
runtime: {
day_of_week: {
type: "keyword",
script: {
source:
"emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ENGLISH))",
},
},
},
},
},
});
console.log(response1);
コンソール
PUT _component_template/component_template1
{
"template": {
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
}
}
}
}
}
PUT _component_template/runtime_component_template
{
"template": {
"mappings": {
"runtime": {
"day_of_week": {
"type": "keyword",
"script": {
"source": "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ENGLISH))"
}
}
}
}
}
}
このコンポーネントテンプレートは、新しいインデックスがテンプレートに一致する際に、マッピングにランタイムフィールド 名付けられた day_of_week を追加します。 |
以下のリクエストは、これらのコンポーネントテンプレートで構成されたインデックステンプレートを作成します。
コンソール
PUT _index_template/template_1
{
"index_patterns": ["te*", "bar*"],
"template": {
"settings": {
"number_of_shards": 1
},
"mappings": {
"_source": {
"enabled": true
},
"properties": {
"host_name": {
"type": "keyword"
},
"created_at": {
"type": "date"
}
}
},
"aliases": {
"mydata": { }
}
},
"priority": 500,
"composed_of": ["component_template1", "runtime_component_template"],
"version": 3,
"_meta": {
"description": "my custom"
}
}