索引模板
在类似日志的场景下,索引模板是非常有效的。一般日志是需要每天都自动生成一个模板的,这样对数据的管理以及集群的性能容灾等都是一个非常有用的帮助。但是每天根据日期都生成一个索引有一个问题,那就是索引的配置,如果每天都是我们自己去手动创建当天的索引,会非常麻烦并且容易出错,所幸的是,ElasticSearch 已经考虑到了这一点并且提出了索引模板的概念,配置好模板之后,只需要每天根据模板去生成索引便好。
Index Templates
Index Templates 就是 ElasticSearch 帮你生成一个模板,你只需要配置好 mapping 与 settings ,ElasticSearch 就会按照一定的规则将这些设置赋予新的索引。
- 模板只会在一个索引新建时才会起作用,修改模板不会影响已经创建的索引结构
- 可以设置多个索引模板,最终生成索引时这些模板会自动 merge 合并
- 可以通过 order 优先序列号 去控制 merge 的过程
使用方式
_template API 是 ElasticSearch 专门设置模板使用的。一个模板有几个重要元素:
- index_patterns 匹配规则,表示那些索引名创建时会使用模板
- order 影响merge 的顺序
- version 版本号
- mappings
- settings
所有的索引创建设置一个模板
#Create a default template
PUT _template/template_default
{
"index_patterns": ["*"],
"order" : 0,
"version": 1,
"settings": {
"number_of_shards": 1,
"number_of_replicas":1
}
}
上边就是一个模板创建的过程,这个模板设置了一下分片的大小,默认是主分片与副分片各为1,并且设置了index_patterns 为 * 意思就是所有的索引创建都会使用这个模板。
test 开头的索引创建一个模板
PUT /_template/template_test
{
"index_patterns" : ["test*"],
"order" : 1,
"settings" : {
"number_of_shards": 1,
"number_of_replicas" : 2
},
"mappings" : {
"date_detection": false,
"numeric_detection": true,
"properties" : {
"someDate" : {
"type" : "keyword"
},
"someNumber" : {
"type" : "long"
}
}
}
}
上边这个模板设置了index_patterns 为 test* 意思就是为 test开头的索引创建都会使用这个模板,并且这个模板还设置了一个 mappings,这个mappings 的意思是 开启日期的自动转化。
我们写入一个新的索引并且查看一下这个索引的mapping
#写入新的数据,index以test开头
PUT testtemplate/_doc/1
{
"someNumber":"1",
"someDate":"2019/01/01"
}
结果:{
"testtemplate" : {
"mappings" : {
"date_detection" : false,
"numeric_detection" : true,
"properties" : {
"someDate" : {
"type" : "keyword"
},
"someNumber" : {
"type" : "long"
}
}
}
}
}
可以发现mappins的设置已经生效了。
查看模板设置
#查看template信息
GET /_template/template_default
#通配符* 可以查看所有的模板
GET /_template/temp*
删除模板设置
DELETE /_template/template_test
注意: 如果在创建索引时指定了mappings 或者是 settings,那么指定的这个配置优先级比模板的配置高,会覆盖模板的配置。
Dynamic Template
Dynamic Template 也是索引模板的一种,不过他可以根据ElasticSearch自动识别字段类型的这个特性,去设置一些特殊字段的名称为某些特定的类型。
- 可以设置所有字符串类型的字段都为 keyword
- is 开头的字符串都设置成为 boolean 类型
设置一个 Dynamic Template
- Dynamic Template 是设置在模板的mappings 中的,因为他要对字段生效
- 匹配规则是一个数组
- 为匹配到的字段设置类型
PUT my_index
{
"mappings": {
"dynamic_templates": [
{
"strings_as_boolean": {
"match_mapping_type": "string",
"match":"is*",
"mapping": {
"type": "boolean"
}
}
},
{
"strings_as_keywords": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
]
}
}