创建或更新索引模板 API
编辑创建或更新索引模板 API
编辑创建或更新索引模板。索引模板定义了可以自动应用于新索引的设置、映射和别名。
resp = client.indices.put_index_template( name="template_1", index_patterns=[ "template*" ], priority=1, template={ "settings": { "number_of_shards": 2 } }, ) print(resp)
const response = await client.indices.putIndexTemplate({ name: "template_1", index_patterns: ["template*"], priority: 1, template: { settings: { number_of_shards: 2, }, }, }); console.log(response);
PUT /_index_template/template_1 { "index_patterns" : ["template*"], "priority" : 1, "template": { "settings" : { "number_of_shards" : 2 } } }
请求
编辑PUT /_index_template/<index-template>
描述
编辑Elasticsearch 根据匹配索引名称的通配符模式将模板应用于新索引。
索引模板在数据流或索引创建期间应用。对于数据流,这些设置和映射在创建流的后备索引时应用。
在创建索引请求中指定的设置和映射将覆盖索引模板中指定的任何设置或映射。
对索引模板的更改不会影响现有索引,包括数据流的现有后备索引。
索引模板中的注释
编辑您可以在索引模板中使用 C 风格的 /* */ 块注释。 您可以将注释包含在请求正文中的任何位置,但开头的大括号之前除外。
路径参数
编辑-
<index-template>
- (必需,字符串) 要创建的索引模板的名称。
查询参数
编辑-
create
- (可选,布尔值) 如果为
true
,则此请求无法替换或更新现有索引模板。默认为false
。 -
master_timeout
- (可选,时间单位) 等待主节点的时间。如果主节点在超时过期之前不可用,则请求将失败并返回错误。默认为
30s
。也可以设置为-1
表示请求永不超时。
请求正文
编辑-
composed_of
- (可选,字符串数组) 组件模板名称的有序列表。组件模板按照指定的顺序合并,这意味着最后一个指定的组件模板具有最高的优先级。有关示例,请参阅 组合多个组件模板。
-
data_stream
-
(可选,对象) 如果包含此对象,则该模板用于创建数据流及其后备索引。支持空对象。
数据流需要具有
data_stream
对象的匹配索引模板。请参阅创建索引模板。 -
index_patterns
-
(必需,字符串数组) 用于在创建期间匹配数据流和索引名称的通配符 (
*
) 表达式数组。Elasticsearch 包含多个内置索引模板。为避免与这些模板发生命名冲突,请参阅避免索引模式冲突。
-
_meta
- (可选,对象) 关于索引模板的可选用户元数据。可以包含任何内容。此映射不是由 Elasticsearch 自动生成的。
-
priority
- (可选,整数) 用于确定在创建新数据流或索引时索引模板优先级的优先级。选择优先级最高的索引模板。如果未指定优先级,则将该模板视为优先级为 0(最低优先级)。此数字不是由 Elasticsearch 自动生成的。
-
template
-
(可选,对象) 要应用的模板。它可能可选地包含
aliases
、mappings
或settings
配置。template
的属性-
aliases
-
(可选,对象的对象) 要添加的别名。
如果索引模板包含
data_stream
对象,则这些是数据流别名。否则,这些是索引别名。数据流别名忽略index_routing
、routing
和search_routing
选项。aliases
对象的属性-
<alias>
-
(必需,对象) 键是别名名称。索引别名名称支持日期数学。
对象正文包含别名的选项。支持空对象。
<alias>
的属性-
filter
- (可选,查询 DSL 对象) 用于限制别名可以访问的文档的查询。
-
index_routing
- (可选,字符串) 用于将索引操作路由到特定分片的值。如果指定,这将覆盖索引操作的
routing
值。 -
is_hidden
- (可选,布尔值) 如果为
true
,则别名为隐藏。默认为false
。别名的所有索引必须具有相同的is_hidden
值。 -
is_write_index
- (可选,布尔值) 如果为
true
,则索引是别名的写入索引。默认为false
。 -
routing
- (可选,字符串) 用于将索引和搜索操作路由到特定分片的值。
-
search_routing
- (可选,字符串) 用于将搜索操作路由到特定分片的值。如果指定,这将覆盖搜索操作的
routing
值。
-
-
-
mappings
-
(可选,映射对象) 索引中字段的映射。如果指定,此映射可以包括
请参阅映射。
-
settings
- (可选,索引设置对象) 索引的配置选项。请参阅索引设置。
-
-
version
- (可选,整数) 用于在外部管理索引模板的版本号。此数字不是由 Elasticsearch 自动生成的。
-
deprecated
- (可选,布尔值) 将此索引模板标记为已弃用。当创建或更新使用已弃用组件的非已弃用索引模板时,Elasticsearch 将发出弃用警告。
示例
编辑具有索引别名的索引模板
编辑您可以在索引模板中包含索引别名。
resp = client.indices.put_index_template( name="template_1", index_patterns=[ "template*" ], template={ "settings": { "number_of_shards": 1 }, "aliases": { "alias1": {}, "alias2": { "filter": { "term": { "user.id": "kimchy" } }, "routing": "shard-1" }, "{index}-alias": {} } }, ) print(resp)
const response = await client.indices.putIndexTemplate({ name: "template_1", index_patterns: ["template*"], template: { settings: { number_of_shards: 1, }, aliases: { alias1: {}, alias2: { filter: { term: { "user.id": "kimchy", }, }, routing: "shard-1", }, "{index}-alias": {}, }, }, }); console.log(response);
多个匹配模板
编辑如果多个索引模板与新索引或数据流的名称匹配,则将使用优先级最高的模板。例如
resp = client.indices.put_index_template( name="template_1", index_patterns=[ "temp*" ], priority=0, template={ "settings": { "number_of_shards": 1, "number_of_replicas": 0 }, "mappings": { "_source": { "enabled": False } } }, ) print(resp) resp1 = client.indices.put_index_template( name="template_2", index_patterns=[ "template*" ], priority=1, template={ "settings": { "number_of_shards": 2 }, "mappings": { "_source": { "enabled": True } } }, ) print(resp1)
const response = await client.indices.putIndexTemplate({ name: "template_1", index_patterns: ["temp*"], priority: 0, template: { settings: { number_of_shards: 1, number_of_replicas: 0, }, mappings: { _source: { enabled: false, }, }, }, }); console.log(response); const response1 = await client.indices.putIndexTemplate({ name: "template_2", index_patterns: ["template*"], priority: 1, template: { settings: { number_of_shards: 2, }, mappings: { _source: { enabled: true, }, }, }, }); console.log(response1);
PUT /_index_template/template_1 { "index_patterns" : ["temp*"], "priority" : 0, "template": { "settings" : { "number_of_shards" : 1, "number_of_replicas": 0 }, "mappings" : { "_source" : { "enabled" : false } } } } PUT /_index_template/template_2 { "index_patterns" : ["template*"], "priority" : 1, "template": { "settings" : { "number_of_shards" : 2 }, "mappings" : { "_source" : { "enabled" : true } } } }
对于以 template*
开头的索引,将启用 _source
,并且该索引将具有两个主分片和一个副本,因为仅应用 template_2
。
不允许在相同优先级下使用具有重叠索引模式的多个模板,并且当尝试在相同优先级下创建与现有索引模板匹配的模板时,将引发错误。
模板版本控制
编辑您可以使用 version
参数向索引模板添加版本号。外部系统可以使用这些版本号来简化模板管理。
version
参数是可选的,不是由 Elasticsearch 自动生成或使用的。
要取消设置 version
,请在不指定版本的情况下替换该模板。
resp = client.indices.put_index_template( name="template_1", index_patterns=[ "foo", "bar" ], priority=0, template={ "settings": { "number_of_shards": 1 } }, version=123, ) print(resp)
response = client.indices.put_index_template( name: 'template_1', body: { index_patterns: [ 'foo', 'bar' ], priority: 0, template: { settings: { number_of_shards: 1 } }, version: 123 } ) puts response
const response = await client.indices.putIndexTemplate({ name: "template_1", index_patterns: ["foo", "bar"], priority: 0, template: { settings: { number_of_shards: 1, }, }, version: 123, }); console.log(response);
PUT /_index_template/template_1 { "index_patterns" : ["foo", "bar"], "priority" : 0, "template": { "settings" : { "number_of_shards" : 1 } }, "version": 123 }
要检查 version
,您可以使用获取索引模板 API。
模板元数据
编辑您可以使用 _meta
参数向索引模板添加任意元数据。此用户定义的对象存储在集群状态中,因此最好保持简短。
_meta
参数是可选的,Elasticsearch 不会自动生成或使用它。
要取消设置 _meta
,请替换模板而不指定它。
resp = client.indices.put_index_template( name="template_1", index_patterns=[ "foo", "bar" ], template={ "settings": { "number_of_shards": 3 } }, meta={ "description": "set number of shards to three", "serialization": { "class": "MyIndexTemplate", "id": 17 } }, ) print(resp)
response = client.indices.put_index_template( name: 'template_1', body: { index_patterns: [ 'foo', 'bar' ], template: { settings: { number_of_shards: 3 } }, _meta: { description: 'set number of shards to three', serialization: { class: 'MyIndexTemplate', id: 17 } } } ) puts response
const response = await client.indices.putIndexTemplate({ name: "template_1", index_patterns: ["foo", "bar"], template: { settings: { number_of_shards: 3, }, }, _meta: { description: "set number of shards to three", serialization: { class: "MyIndexTemplate", id: 17, }, }, }); console.log(response);
PUT /_index_template/template_1 { "index_patterns": ["foo", "bar"], "template": { "settings" : { "number_of_shards" : 3 } }, "_meta": { "description": "set number of shards to three", "serialization": { "class": "MyIndexTemplate", "id": 17 } } }
要检查 _meta
,您可以使用获取索引模板 API。
数据流定义
编辑要将索引模板用于数据流,模板必须包含一个 data_stream
对象。请参阅创建索引模板。
resp = client.indices.put_index_template( name="template_1", index_patterns=[ "logs-*" ], data_stream={}, ) print(resp)
response = client.indices.put_index_template( name: 'template_1', body: { index_patterns: [ 'logs-*' ], data_stream: {} } ) puts response
const response = await client.indices.putIndexTemplate({ name: "template_1", index_patterns: ["logs-*"], data_stream: {}, }); console.log(response);
PUT /_index_template/template_1 { "index_patterns": ["logs-*"], "data_stream": { } }
组合别名、映射和设置
编辑当在索引模板的 composed_of
字段中指定多个组件模板时,它们会按照指定的顺序合并,这意味着后面的组件模板会覆盖前面的组件模板。接下来会合并父索引模板中的任何映射、设置或别名。最后,合并索引请求本身的任何配置。
在此示例中,两个组件模板的顺序会更改索引的分片数
resp = client.cluster.put_component_template( name="template_with_2_shards", template={ "settings": { "index.number_of_shards": 2 } }, ) print(resp) resp1 = client.cluster.put_component_template( name="template_with_3_shards", template={ "settings": { "index.number_of_shards": 3 } }, ) print(resp1) resp2 = client.indices.put_index_template( name="template_1", index_patterns=[ "t*" ], composed_of=[ "template_with_2_shards", "template_with_3_shards" ], ) print(resp2)
const response = await client.cluster.putComponentTemplate({ name: "template_with_2_shards", template: { settings: { "index.number_of_shards": 2, }, }, }); console.log(response); const response1 = await client.cluster.putComponentTemplate({ name: "template_with_3_shards", template: { settings: { "index.number_of_shards": 3, }, }, }); console.log(response1); const response2 = await client.indices.putIndexTemplate({ name: "template_1", index_patterns: ["t*"], composed_of: ["template_with_2_shards", "template_with_3_shards"], }); console.log(response2);
PUT /_component_template/template_with_2_shards { "template": { "settings": { "index.number_of_shards": 2 } } } PUT /_component_template/template_with_3_shards { "template": { "settings": { "index.number_of_shards": 3 } } } PUT /_index_template/template_1 { "index_patterns": ["t*"], "composed_of": ["template_with_2_shards", "template_with_3_shards"] }
在这种情况下,与 t*
匹配的索引将具有三个主分片。如果组合模板的顺序颠倒,则索引将具有两个主分片。
映射定义是递归合并的,这意味着后面的映射组件可以引入新的字段映射并更新映射配置。如果字段映射已包含在较早的组件中,则其定义将被后面的组件完全覆盖。
这种递归合并策略不仅适用于字段映射,还适用于 dynamic_templates
和 meta
等根选项。如果较早的组件包含 dynamic_templates
块,则默认情况下,新的 dynamic_templates
条目将附加到末尾。如果已存在具有相同键的条目,则会被新的定义覆盖。