1-Elasticsearch - Index Templates
前言
索引模板允许我们定义在创建新索引时自动应用的模板。模板包括设置和映射,以及一个简单的模式模板,该模板控制是否应该将模板应用于新索引。
为什么需要索引模板?
在开发中,elasticsearch
很大一部分工作是用来处理日志信息的,比如某公司对于日志处理策略是以日期为名创建每天的日志索引。并且每天的索引映射类型和配置信息都是一样的,只是索引名称改变了。如果手动的创建每天的索引,将会是一件很麻烦的事情。为了解决类似问题,elasticsearch
提供了预先定义的模板进行索引创建,这个模板称作为Index Templates
。通过索引模板可以让类似的索引重用同一个模板。
模板只在创建索引时应用。更改模板不会对现有索引产生影响。当使用create index API
时,作为create index
调用的一部分定义的设置/映射将优先于模板中定义的任何匹配设置/映射。
环境:
- win10
- elasticsearch6.5.4
- kibana6.5.4
本文所有的示例演示都在kibana
的Dev Tools
中完成。
创建索引模板
我们针对前文中提出的问题,来实现一个索引模板:
PUT _template/2019
{
"index_patterns": ["20*", "product1*"], ①
"settings":{ ②
"number_of_shards": 2,
"number_of_replicas": 1
},
"mappings":{ ③
"doc":{
"properties":{
"ip":{
"type":"keyword"
},
"method":{
"type": "keyword"
}
}
}
}
}
①,index_patterns
是索引模式,指当创建以20
和product1
开头的索引时,使用该索引模板。注意,在elasticsearch的6.x版本中,索引模板模式index_patterns
取代原来的template
。
②,在settings
设置中,我们自定义为该索引分配3个主分片。复制分片不变。
③,mappings
中指定映射关系。
查看索引模板
我们来查看一下刚才创建的索引模板。
GET _template/2019
我们还可以通过使用通配符来查询多个模板。
GET /_template/temp*
GET /_template/template_1,template_2
除此之外,我们可以查看所有可用的模板列表:
GET /_template
也可以查询某个模板是否存在:
HEAD _template/2019
注意,返回是以HTTP的状态表示模板是否存在,200
表示存在,404
表示不存在。
索引模板的使用
有了索引模板,我们就可以创建索引并且添加数据了。
PUT 20190101/doc/1
{
"ip": "127.0.0.1",
"method":"GET"
}
PUT 20190102/doc/2
{
"ip":"192.168.1.1",
"method":"POST"
}
PUT product1_log/doc/1
{
"ip":"127.0.0.1",
"method":"GET"
}
上例会按照模板自动生成3个索引20190101
、20190102
和product1_log
。
当然查询也是没有问题的:
GET 2019*/doc/_search
{
"query": {
"match_all": {}
}
}
我们可以通过查询索引的信息来看一下是否应用上了模板。
GET 20190101
# 结果如下
{
"20190101" : {
"aliases" : { },
"mappings" : {
"doc" : {
"properties" : {
"ip" : {
"type" : "keyword"
},
"method" : {
"type" : "keyword"
}
}
}
},
"settings" : {
"index" : {
"creation_date" : "1557889480975",
"number_of_shards" : "2",
"number_of_replicas" : "1",
"uuid" : "FEuyT5aoTnGP3k_7hCtQFA",
"version" : {
"created" : "6050499"
},
"provided_name" : "20190101"
}
}
}
}
由上例可以看出,索引20190101
已经成功应用上了我们之前创建的模板。
多模板匹配
多个索引模板可以应用于同一个索引,顺序由order
参数的大小决定。比如现在有着一样的一个索引模板:
PUT _template/2018_1
{
"index_patterns": ["2018*"],
"order":0,
"settings":{
"number_of_shards": 2
}
}
上述索引模板将应用于以2018
开头的所有索引,设置索引的主分片数量为2,order
参数为0。
PUT 2018010101/doc/1
{
"method":"GET"
}
GET 2018010101/_settings
# 结果如下
{
"2018010101" : {
"settings" : {
"index" : {
"creation_date" : "1557900456281",
"number_of_shards" : "2",
"number_of_replicas" : "1",
"uuid" : "P53RDmT6RRCDY2DlHtpymg",
"version" : {
"created" : "6050499"
},
"provided_name" : "2018010101"
}
}
}
}
可以看到20180101
索引的主分片数量是2,已经成功应用了索引模板。
现在我们再来创建一个索引模板:
PUT _template/2018_2
{
"index_patterns": ["201802*"],
"order":1,
"settings":{
"number_of_shards": 3
}
}
上述模板应用于以201802
开头的索引,只是主分片的数量为3,order
参数为1。
我们再来创建一个索引:
PUT 2018010201/doc/1
{
"method": "POST"
}
GET 20180201/_settings
# 结果如下
{
"20180201" : {
"settings" : {
"index" : {
"creation_date" : "1557901225020",
"number_of_shards" : "3",
"number_of_replicas" : "1",
"uuid" : "-B8_ZiK7QgesmGSzD_8xlQ",
"version" : {
"created" : "6050499"
},
"provided_name" : "20180201"
}
}
}
}
可以看到20180201
索引应用了order
参数为1的索引模板。这在某些情况下非常有效,比如我们预料到2018年2月份的日志将会暴增,而其他月份不变,所以我们通过上述创建多个模板来完成索引创建,2月份每天的索引的主分片都多一片,过了2月,恢复正常。
删除索引模板
删除索引模板使用DELETE
命令删除即可:
DELETE _template/2019
需要注意的是,删除索引模板并不会影响其通过该模板创建的索引。那么,如果想要删除相关的索引怎么办?比如我们删除以2019
开头的索引该怎么办?
DELETE 2019*
可以使用通配符*
来完成。
see also:[Elasticsearch 6 新特性与重要变更解读](https://blog.csdn.net/napoay/article/details/79135136) | [官网:Index Templates](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-templates.html)