本文来学习一下Index Template和Dynamic Template。
Template就是模板的意思,其实这里我更愿意把他称之为模具,他是索引的模具,是为了更好的创建索引使用的。
有这么一种情况,随着项目不断发展,你的ES集群上有很多很多的索引被创建。但是手动创建都有这么个问题,就是你会粗心,可能你创建一个索引的时候忘记指定了分片等设置,这就导致最后的索引创建不正确。
这时候ES为我们提供了一种叫做索引模板的东西(Index Template),我们可以预先创建好模板,以后创建索引的时候就直接套模板。下面就来看看。
一、Index Template
1、什么是Index Template
Index Template是帮助你设置Mappings和Settings的,并按照一定的规则,自动匹配到新创建的索引之上。他具备以下性质。
- 模板仅在一个索引创建时候才会生效,修改模板不会影响已经创建好的索引。
- 你可以设定多个索引模板,这些设置可以通过操作"merge"合并到一起。
- 你可以指定"order"的数值,来控制合并时候的先后顺序。
2、简单例子
创建一个默认的索引看下规则
PUT _template/template_default
{
"index_patterns": ["*"], 所有的索引*
"order" : 0, 合并顺序为0
"version": 1,
"settings": { 模板规则如下
"number_of_shards": 1, # 主分片为1
"number_of_replicas":1 # 副本分片也是1
}
}
这个索引模板的效果就是,每次我们创建索引的时候,
他匹配所有的索引,任何一个创建出来的索引其主分片都是1,
副本分片也是1
PUT /_template/template_test
{
"index_patterns" : ["test*"],所有以test开头的索引都匹配这个
"order" : 1,
"settings" : {
"number_of_shards": 1,
"number_of_replicas" : 2
},
"mappings" : {
"date_detection": false, 这个模板创建出来的匹配date字符串成date类型这个是关闭的动态推测类型
"numeric_detection": true 数字字符串匹配类型是开启的
}
}
3、Index Template的工作方式
Index Template的生效规则如下:当一个索引被创建的时候。
- 应用ES默认的setting和mappings
- 应用order数值低的Index Template中的设定
- 应用order高的Index Template中的设定,之前的设定被之后的设定覆盖
- 应用创建索引的时候,用户自己指定的setting和mappings,并且会覆盖之前模板的设定。
4、索引模板实操
1、创建两个模板
一个是匹配所有的,一个是只匹配test开头的。order分别是0,1
PUT _template/template_default
{
"index_patterns": ["*"],
"order" : 0,
"version": 1,
"settings": {
"number_of_shards": 1,
"number_of_replicas":1
}
}
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
}
}
2、查看索引模板的语法
#查看template信息
GET /_template/template_default 指定名称查
GET /_template/temp* 按照前缀匹配查,后中缀也可以
3、插入文档
#写入新的数据,index以test开头
PUT testtemplate/_doc/1
{
"someNumber":"1",
"someDate":"2019/01/01"
}
这个索引会匹配上面两个,顺序是order小的先,所以test的规则会被匹配。
查看一下这个索引的mapping和setting如下:
GET testtemplate/_mapping结果如下
{
"testtemplate" : {
"mappings" : {
"date_detection" : false,
"numeric_detection" : true,
"properties" : {
"someDate" : { 日期的被关闭了,识别成了text
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"someNumber" : { 数字的还开着,虽然插入文档是字符串,但是被动态识别成了long
"type" : "long"
}
}
}
}
}
GET testtemplate/_settings settings结果如下
{
"testtemplate" : {
"settings" : {
"index" : {
"creation_date" : "1658568366613",
"number_of_shards" : "1",
"number_of_replicas" : "2",
"uuid" : "y7-rXrr5QHK_ZcwAdugJiw",
"version" : {
"created" : "7010099"
},
"provided_name" : "testtemplate"
}
}
}
}
主副本都是按照模板生成的规则。
4、插入文档的时候,自己指定mapping
插入索引
PUT testmy
{
"settings":{
"number_of_replicas":5
}
}
给索引插入文档
PUT testmy/_doc/1
{
"key":"value"
}
查看一下索引的setting
GET testmy/_settings结果如下
{
"testmy" : {
"settings" : {
"index" : {
"creation_date" : "1658568688452",
"number_of_shards" : "1",
"number_of_replicas" : "5",
"uuid" : "YMvHRKDJQz2sKD5SP-Iirg",
"version" : {
"created" : "7010099"
},
"provided_name" : "testmy"
}
}
}
}
我们看到配置是按照用户指定的生效的。覆盖了所有的模板指定。
5、删除历史数据
DELETE testmy
DELETE /_template/template_default
DELETE /_template/template_test
二、Dynamic Template
1、什么是Dynamic Template
翻译一下就是动态模板。
其作用是根据ES识别的数据类型,结合你字段名称的命名方式,来动态设定字段类型。打个比方。
1、你可以把所有的字符串类型都设定为keyword,或者干脆关闭keyword。
2、is开头的字段你可以设置成布尔类型。
3、long_开头的你可以设置成long类型、
你就可以让文档中的类型推断符合你自己的预期。
这个东西用的不多,后面回来搞定这里。TODO
#Dynaminc Mapping 根据类型和字段名
DELETE my_index
PUT my_index/_doc/1
{
"firstName":"Ruan",
"isVIP":"true"
}
GET my_index/_mapping
DELETE my_index
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"
}
}
}
]
}
}
DELETE my_index
#结合路径
PUT my_index
{
"mappings": {
"dynamic_templates": [
{
"full_name": {
"path_match": "name.*",
"path_unmatch": "*.middle",
"mapping": {
"type": "text",
"copy_to": "full_name"
}
}
}
]
}
}
PUT my_index/_doc/1
{
"name": {
"first": "John",
"middle": "Winston",
"last": "Lennon"
}
}
GET my_index/_search?q=full_name:John
三、总结
这一节的主要作用就是开发的时候方便点,其余的说实话,我感觉没到核心操作上。