基于ES 7.7 英文官方文档
主要内容:
- 新增或修改索引模板(Put index templates)
- 删除索引模板(Deltet index templates)
- 获取索引模板信息(Get index templates)
- 判断一个模板是否存在(Index templates exists)
1. 新增或修改索引模板(Put index template API)
可以参考: https://www.jianshu.com/p/1f67e4436c37
PUT /_template/<index-template>
描述
索引模板, 就是可以在创建新索引时自动应用的settings和mappings。 Elasticsearch通过索引名的匹配(index name pattern)将模板应用于新索引。
索引模板仅在创建索引时起作用,索引模板的修改不会影响已存在的索引。 在创建索引时指定的settings和mappings选项将覆盖与之相匹配的索引模板中的设置。
索引模板中可以写备注
可以在索引模板的body内(花括号内部)任意地方使用c语言风格的块注释(/**/):
# 不能在body的最外面的两个大括号之外写注释, 其他地方随意.
PUT _template/template_1
{
/* 我这里可以写注释 */
"index_patterns": ["te*", "bar*"],
/* 注释2 */
"settings": {
/* 注释3 */
"number_of_shards": 1
}
}
目前kibana 7.7的web console界面里写代码会提示错误"Bad string", 但是不影响代码执行
索引创建/管理等api的body内目前都不支持写备注
获取索引时, 不会显示之前添加的备注, 怎么办????
路径参数
<index_template>
索引模板名称, 必填.
请求参数
create
(可选, bool) 如果设置为true
,则只能新增模板,不能替换/修改已有的模板。默认false
,会自动判断是create还是update操作。
order
(可选, integer) 如果一个索引匹配到多个模板, 则这个顺序决定了模板的优先级。数值越大,优先级越高。优先级高的模板的设置会覆盖优先级低的模板里面的配置。es会先合并低优先级的模板设置,最后合并高优先级的模板设置。
master_timeout
(可选,时间单位)连接到主节点的等待超时时间。如果在超时时间已过之前没有响应, 则返回错误。 默认是值 30s。
Request body
index_patterns
(必填, 字符串数组) 通配符表达式的数组
aliases
(可选, 别名对象(alias object)) 索引的别名. 参考 添加或修改索引别名
mappings
(可选, mapping 对象) 索引字段的mapping。如果指定了mapping,则可以包含:
更多参考 mapping官方文档
settings
version
(可选, integer) 用于外部管理索引模板的版本号。es不会自动生成这个数字,需要手动指定。
几个栗子
1. 在索引模板中指定索引别名
PUT _template/template_1
{
/* 用通配符匹配索引名称, 以后新增的以te开头的索引都会以此为模板 */
"index_patterns": ["te*"],
"settings":{
"number_of_shards": 1
},
/* 几个别名 */
"aliases":{
/* 固定的别名1 */
"alias1":{},
/* 固定的别名2: 带条件和路由 */
"alias2":{
"filter":{
"term":{"user": "kimchy"}
},
"routing": "kimchy"
},
/* 以{}定义的占位符, 应用模板时会替换为实际的索引名称 */
"{index}-alias": {}
}
}
上面的代码中有一个占位符{index}
, 应用模板时会替换为索引名称。
执行代码, 然后我们再新增一个te开头的索引, 然后查看这个索引的定义:
# 新增索引, 以te开头, 可以匹配上面的索引模板
PUT /te_1
# 查看索引的定义
GET /te_1
查看这个新增的索引te_1的定义, 结果如下:
{
"te_1" : {
"aliases" : {
"alias1" : { },
"alias2" : {
"filter" : {
"term" : {
"user" : "kimchy"
}
},
"index_routing" : "kimchy",
"search_routing" : "kimchy"
},
"te_1-alias" : { }
},
"mappings" : { },
"settings" : {
"index" : {
"creation_date" : "1635861702500",
"number_of_shards" : "1",
"number_of_replicas" : "1",
"uuid" : "qtAMSW4cSI2JZ1B4BkNyeQ",
"version" : {
"created" : "7070099"
},
"provided_name" : "te_1"
}
}
}
}
2. 一个索引匹配多个索引模板
多个索引模板可能会同时匹配到一个索引名称上,这个时候就轮到参数order
上场了!它决定了谁的配置的优先级更高。优先级高的模板的配置会覆盖优先级低的。从低的开始合并,生成最终的配置。
如果一个索引匹配的模板中有
order
设置一样的,那么会导致一个不确定的覆盖顺序。
# 先建立一个优先级最低的模板
PUT /_template/template_1
{
/* 匹配所有索引, 可以看做是索引的自定义的默认设置*/
"index_patterns": ["*"],
/* 排序, 设置最小0 */
"order": 0,
"settings": {
"number_of_shards": 1
},
"mappings": {
"_source": {"enabled": false}
}
}
# 再建立一个优先级高的模板
PUT /_template/template_2
{
/* 匹配所有已te开头的索引 */
"index_patterns": ["te*"],
/* 排序, 设置为2, 比上面那个优先级高*/
"order": 1,
"settings": {
"number_of_shards": 2 /* 差异点1 */
},
"mappings": {
"_source": {"enabled": true}/* 差异点2 */
}
}
上面两个模板的差异点已经在注释中标注了。
现在新建一个索引 te_1
PUT /te_1
GET /te_1
那么最终呈现的结果是:
{
"te_1" : {
"aliases" : { },
"mappings" : { },/*很奇怪这里没有看到配置*/
"settings" : {
"index" : {
"creation_date" : "1635863786534",
"number_of_shards" : "2", /*这里的配置是优先级高的那个模板的*/
"number_of_replicas" : "1",
"uuid" : "zJzTWrYrSwmWRl_lhj2dKw",
"version" : {
"created" : "7070099"
},
"provided_name" : "te_1"
}
}
}
}
诡异的是,
mappings._source.enabled
配置没有获取到, why? 官方文档中说"Note, for mappings, the merging is "deep", meaning that specific object/property based mappings can easily be added/overridden on higher order templates, with lower order templates providing the basis." 这说得也很正常啊!
3. 管理模板的版本
PUT /_template/template_1
{
"index_patterns" : ["*"],
"order" : 0,
"settings" : {
"number_of_shards" : 1
},
/* 指定版本, 这个版本号只是为了管理的方便, ES不会自动生成或自动增加它的值 */
"version": 123
}
如果想获取模板的版本号, 可以使用模板查询接口, 且只显示版本号选项:
GET /_template/template_1?filter_path=*.version
如果想删除版本号,修改模板的时候移除这个参数即可。比如:
PUT /_template/template_1
{
"index_patterns" : ["*"],
"order" : 0,
"settings" : {
"number_of_shards" : 1
}
/* 这里移除了version 设置*/
}
ES7.15版本文档中提及的内容
ES 7.15文档 链接
es内置了一些索引模板, 要避免模板的命名与这些模板冲突, 比如:
- logs--
- metrics--
- synthetics--
这些模板的order
都是100。
2. 删除索引模板(Deltet index templates API)
删除一个或多个索引模板。 官方文档
DELETE /_template/<index-template>
路径参数
index-template
(必填, string) 索引模板名, 支持单个模板的字符串, 多个模板名的英文逗号分割、通配符表达式。
查询参数
master_timeout
(可选,时间单位)连接到主节点的等待超时时间。如果在超时时间已过之前没有响应, 则返回错误。 默认是值 30s。
timeout
(可选,时间单位)等待返回结果的超时时间。如果在超时时间已过之前没有响应, 则返回错误。 默认是值 30s
。
栗子:
DELETE /_template/template1
DELETE /_template/template1,template2
DELETE /_template/template*
3. 获取索引模板信息(Get index templates API)
获取一个或多个索引模板的信息。官方文档
GET /_template/<index-template>
路径参数
index-template
(必填, string) 索引模板名, 支持单个模板的字符串, 多个模板名的英文逗号分割、通配符表达式。
查询参数
flat_settings
(可选, bool) 如果设置为true
,则以平面格式返回设置信息。默认false
。
local
(可选, bool) 如果设置为true
, 则只从本地节点获取信息。默认false
,表示从主节点获取信息。
master_timeout
(可选,时间单位)连接到主节点的等待超时时间。如果在超时时间已过之前没有响应, 则返回错误。 默认是值 30s。
几个栗子
1. 获取多个模板的信息
GET /_template/template_1,template_2
2. 通配符表达式获取所有匹配的模板的信息
GET /_template/template*
3. 获取所有的索引模板的信息
GET /_template
4. 获取索引模板的列表
# 获取所有的索引模板的列表
GET /_cat/templates
# 通配符表达式: 获取前缀为template的模板的列表
GET /_cat/templates/template*
4. 判断一个模板是否存在(Index templates exists API)
HEAD /_template/<index-template>
路径参数
index-template
(必填, string) 索引模板名, 支持单个模板的字符串, 多个模板名的英文逗号分割、通配符表达式。
查询参数
flat_settings
(可选, bool) 如果设置为true
,则以平面格式返回设置信息。默认false
。
ES7.15的文档中仍然有这个参数, 但是这个参数放在这里有什么用??
local
(可选, bool) 如果设置为true
, 则只从本地节点获取信息。默认false
,表示从主节点获取信息。
master_timeout
(可选,时间单位)连接到主节点的等待超时时间。如果在超时时间已过之前没有响应, 则返回错误。 默认是值 30s。
返回状态
-
200 所有指定的索引模板都存在
-
404 至少有一个指定的索引模板不存在
注意!! ES 7.7下实际测试结果与文档描述不相符!! ES 7.7下实际测试结果与文档描述不相符!! ES 7.7下实际测试结果与文档描述不相符!!
- 只要有一个索引存在, 就会返回 200
- 当所有索引不存在时才返回 404
last updated at 2021/11/3 17:58