【ElasticSearch入门】6、Index Template和Dynamic Template
集群上的索引会越来越多,例如,你会为日志每天创建个索引
使用多个索引可以让你的更好的管理的你数据,提高性能
一、Index Template
Index Templates 帮助你设定 Mapping 和 Settings,并按照一定的规则,自动匹配到新创建的索引之上
模板仅在一个索引被新创建时,才会产生作用。修改模板不会影响已创建的索引
可以设定多个索引模板,这些设置会被 merge 在一起
可以指定 order 的数值,控制 merging 的过程
两个 Index Templates
右边的mapping设置日期探测关闭,数字探测打开。
Index Template 工作方式
当一个索引被新创建时
- 应用 Elasticsearch默认的 settings 和 mappings
- 应该 order 数值低的 Index Template 中的设定
- 应用 order 高的 Index Template 中的设定,之前的设定会被覆盖
- 应用创建索引时,用户所指定的 Settings 和 Mappings,并覆盖之前模板中的设定
demo
首先进行默认的dynamic mapping 的写入
PUT ttemplate/_doc/1
{
"someNumber":"1",
"sumeDate":"2022/05/21"
}
GET ttemplate/_mapping
查看索引mapping信息
someDate字段默认被转化成为date类型
我们这时创建两个index template
#Create a default template
PUT _template/template_default
{
//前缀匹配
"index_patterns": ["*"],
//order值,越大级别越高
"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" : {
//将日期探测设置为false
"date_detection": false,
"numeric_detection": true
}
}
我们根据template规则创建新的index
#Create a default template
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
}
}
并且在replicas也设置为order数较大template所指定的2
二、Dynamic Template
根据 Elasticsearch 识别的数据类型,结合字段名称,来动态设定字段类型
- 所有的字符串类型都设定称 Keyword,或者关闭 keyword 字段
- is 开头的字段都设置成 boolean
- long_ 开头的都设置成 long 类型
官网说明:
- Dynamic Template 是定义在某个索引的 Mapping 中
- Template 有个名字
- 匹配规则是个一个数组
- 为匹配到字段设置 Mapping
demo
先看没有使用dynamic mapping的情况
PUT my_index/_doc/1
{
"firstName":"Ruan",
"isVip":"true"
}
都是text类型
下面我们创建 dynamic mapping
PUT my_index
{
"mappings": {
"dynamic_templates": [
{
"full_name": {
//匹配所有name开头的字段
"path_match": "name.*",
//不匹配中间为middle的字段
"path_unmatch": "*.middle",
"mapping": {
"type": "text",
//copy_to fullname
"copy_to": "full_name"
}
}
}
]
}
}
下面插入doc
PUT my_index/_doc/1
{
"name": {
"first": "John",
"middle": "Winston",
"last": "Lennon"
}
}
GET my_index/_search?q=full_name:John
搜索成功!
fullname搜索如果换为middle name 的Winston 则查找不到