集群上的索引会随着时间越来越多,例如,会为你的日志每天创建一个索引。
使用多个素银可以更好的管理数据,提高性能,例如:logs-2019-05-01、logs-2019-05-02。
1. Index Template
1.1 什么是Index Template?
- Index Template:帮助你设定 Mapping 和 Settings,并按照一定的规则自动匹配到新创建的索引上
- Mappings 主要作用于字段的信息说明;
- Settings 主要作用于 index 的一些相关配置信息,如分片数、副本数,tranlog 同步条件、refresh 等;
- 模板尽在一个索引被新创建时,才会产生作用。修改模板不会影响已创建的索引;
- 你可以设定多个索引模板,这些设置会被 “merge” 在一起;
- 你可以指定 “order” 的数值,控制 “merging” 的过程;
1.2 Index Template的工作方式
- 当一个索引被新创建时
- 使用 Elasticsearch 默认的 settings 和 mappings
- 使用 order 数值低的 Index Template 中的设定
- 使用 order 数值高的 Index Template 中的设定,之前的设定会被覆盖
- 创建索引时,用户如果自己配置 settings 和 mappings,并覆盖之前模板中的设定
:::info 只要索引名字满足模板中的正则表达式,就会在索引创建时自动触发索引模板。 :::
#插入数据
PUT ttemplate/_doc/1
{
"someNumber":"1",
"someDate":"2019/01/01"
}
#查看Dynamic Mapping,数字字符串被映射成text,日期字符串被映射成日期
GET ttemplate/_mapping
#创建2个Index Template
#创建一个默认的 default template
PUT _template/template_default
{
"index_patterns": ["*"],
"order" : 0,
"version": 1,
"settings": {
"number_of_shards": 1,
"number_of_replicas":1
}
}
#创建template_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
}
}
#查看template信息
GET /_template/template_default
GET /_template/temp*
#写入新的数据,index以test开头
PUT testtemplate/_doc/1
{
"someNumber":"1",
"someDate":"2019/01/01"
}
#数字转成long,日期字符串转成text
GET testtemplate/_mapping
#primary:1, replica: 2
GET testtemplate/_settings
#创建一个临时索引test*开头,会触发template_test模板
PUT testmy
{
"settings":{
"number_of_replicas":5
}
}
PUT testmy/_doc/1
{
"key":"value"
}
#查看replica: 5
GET testmy/_settings
#清理
DELETE testmy
DELETE /_template/template_default
DELETE /_template/template_test
2. Dynamic Template
2.1 什么是 Dynamic Template?
- 根据 ES 识别的数据类型,结合字段名称,来动态设定字段类型,例如:
- 所有的字符串类型都设定成 keyword,或者关闭 keyword 字段
- is 开头的字段都设置成 boolean
- long_ 开头的都设置成 long 类型
2.2 Dynamic Template设定
- Dynamic Template 是定义在某个索引的 Mapping 中;
- Template 有一个名称;
- 匹配规则是一个数组,参数如下:
- match_mapping_type:自动识别文档中的字段值在对应匹配到 ES 中的类型,如 string、boolean 等;
- match,unmatch:寻找匹配文档有没有对应匹配的字段名;
- path_match,patch_unmatch:结合路径去匹配字段名
- 为匹配到字段设置 Mapping;
:::info
- 注意 template 数组中的顺序:
- 模板按照顺序来检测,第一个匹配的模板会被优先启用;
- 例如,我们给 string 类型字段定义两个模板:
- strings_as_boolean:以 is 开头的字段名会映射成 boolean;
- strings_as_keywords:所有其他 text 字段映射成 keyword;
- 我们将 string_as_boolean 模板放在第一位,因为它比匹配所有字符串字段的 strings_as_keyword 模板更特殊。 ::: ```json DELETE my_index
Dynaminc Mapping 根据类型和字段名
PUT my_index/_doc/1 { “firstName”:”Ruan”, “isVIP”:”true” }
查看Dynaminc Mapping,对应的都是text类型
GET my_index/_mapping
DELETE my_index
为索引创建mapping,在mapping中创建dynamic template
给每一种匹配映射创建一个dynamic template,并取一个名字
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
结合路径
匹配name路径下的除了middle的所有字段,将其类型配置为text,且内容copy到full_name
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 ```