前言
index template 顾名思义为索引的模板,它指的是我们先预先定义索引的 setting 和 mapping,在新的 index 创建的过程中,会自动应用我们已经定义好的 mapping 和 setting,一方面,index template 简化了我们创建索引时的步骤,另一方面,一个标准化的模板,会使日后的索引管理更加方便。
如何使用 index template
1. 创建一个 index template
这个 index template 有如下特点:
- 我们定义了一个名为 logs_template的 index template。
- index_patterns =logs-* 说明 以"logs-" 开头的索引,将具备这个 template 所配置的mapping 和 setting。
- order 指的是索引应用模板的顺序,1 表明此模板优先级为最高。
PUT _template/logs_template
{
"index_patterns": "logs-*",
"order": 1,
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"host_name": {
"type": "keyword"
},
"created_at": {
"type": "date",
"format": "EEE MMM dd HH:mm:ss Z yyyy"
}
}
}
}
2. 创建 index 并查看 mapping 和 setting
PUT logs-2022-02-15
GET logs-2022-02-15/_mapping
返回值如下:
{
"logs-2022-02-15" : {
"mappings" : {
"properties" : {
"created_at" : {
"type" : "date",
"format" : "EEE MMM dd HH:mm:ss Z yyyy"
},
"host_name" : {
"type" : "keyword"
}
}
}
}
}
GET logs-2022-02-15/_settings
返回值如下:
{
"logs-2022-02-15" : {
"settings" : {
"index" : {
"creation_date" : "1644894349069",
"number_of_shards" : "1",
"number_of_replicas" : "1",
"uuid" : "b1aH4dWNStul_a8A3CeUfQ",
"version" : {
"created" : "7100299"
},
"provided_name" : "logs-2022-02-15"
}
}
}
}
3. index 匹配多个 template
我们有如下两个 index template:
- template_0 将禁用存储 _source,对所有index 有效。同时设定了分片数为2,副本数为1
- 但对于以 logs* 开头的索引,仍将启用 _source。同时设定了分片数为1,副本数为1
- 两个 template 的 order 均为 0
PUT _template/logs_template_0
{
"index_patterns": "*",
"order": 0,
"settings": {
"number_of_shards": 2,
"number_of_replicas": 1
},
"mappings": {
"_source": {
"enabled": false
},
"properties": {
"name": {
"type": "text"
}
}
}
}
PUT _template/logs_template_1
{
"index_patterns": "logs*",
"order": 1,
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
},
"mappings": {
"_source": {
"enabled": true
},
"properties": {
"name": {
"type": "text"
}
}
}
}
创建 一个名为 logs-2022-02-15 的index,我们原本以为 index 会精确的匹配到logs_template_1,实际上却匹配到了logs_template_0,和我们的预期不符。
对于两个 templates 来说,如果 order 是一样的话,并且index_patterns 有重叠部分, ES 可能陷于一种不可知的合并状态。在实际的使用中必须避免。
如果我们将 logs_template_1 中的 order 设置为1,出现的结果是符合我们预期的。
PUT logs-2022-02-15
GET logs-2022-02-15
{
"logs-2022-02-15" : {
"aliases" : { },
"mappings" : {
"_source" : {
"enabled" : false
},
"properties" : {
"name" : {
"type" : "text"
}
}
},
"settings" : {
"index" : {
"creation_date" : "1644902819841",
"number_of_shards" : "2",
"number_of_replicas" : "1",
"uuid" : "DkMML4hnSXWMRo4Gtjf5Bg",
"version" : {
"created" : "7100299"
},
"provided_name" : "logs-2022-02-15"
}
}
}
}
4. 查询 index template
我们可以通过如下的接口来查询已经被创建好的 index template:
GET /_template/<index name>
或者使用如下方式来查询多个 template
GET /_template/logs_template_1,logs_template_2
GET /_template/logs*
GET /_template
5. 删除一个 index template
DELETE /_template/<index-template>
6. index template 的一些特性
- 模板只在一个索引被创建的时候才会产生作用,修改模板不会影响已创建的索引。
- 用户所指定的 Settings 和 Mappings 会覆盖之前模板中的设定,也就是说,手动指定的 settings 和 mapping 优先级要高于模板。
参考文档
[1] https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-templates-v1.html
如果您有其他问题,欢迎您联系火山引擎技术支持服务