[toc]
一、Index Template简介
1. 什么是index模板?
帮助你设定2. 关于index模板的几个问题mappings
和settings
; 并按照一定的规则,自动匹配到新建的索引
上;
Q1: 已新建了索引A使用了模板M,修改了M后会影响A吗?
A: 不会! 模板仅仅在一个索引被创建时,才产生作用。修改模板不会影响已经创建的索引。Q2: 可否设定使用多个index模板?
A: 可以! 设定多个索引模板,这些模板会被merge
在一起。
Q3: 设定多个index模板,起作用是按什么顺序?
A: 你可以指定二、 index template案例 2.1 两个模板定义和创建索引的作用优先级order
的数值,控制merging
的过程。order大的有限起作用!
2.1.1 模板1设定所有索引创建时->分片数1,副本数1
# 1. 所有索引:分片数1,副本数1
PUT _template/my_template
{
"index_patterns": ["*"],
"order": 10, // order大的优先
"version": 1,
"settings": {
"number_of_shards": 1,
"number_of_replicas": 1
}
}
2.1.2 模板2设定test开头的索引设置主分片1,副本数2; 关闭date识别,开启数字识别
- date识别(date_detection)就是:字符串的日期,识别为date(默认是开启的)
- 数字识别(numeric_detection)就是:字符串的数字,识别为数字类型(默认是关闭的);
#2.test开头的索引设置主分片1,副本数2;
关闭date识别,开启数字识别
PUT _template/my_template_test
{
"index_patterns": ["test*"],
"order": 1,
"settings":{
"number_of_shards": 1,
"number_of_replicas": 2
},
"mappings":{
"date_detection": false,
"numeric_detection": true
}
}
2.1.3 创建test开头的索引,验证
PUT test_template_index/_doc/1
{
"someNumber": "1",
"somDate": "2019/01/01"
}
看看作用效果:
GET test_template_index/_mapping
看看结果:
{
"test_template_index" : {
"mappings" : {
"date_detection" : false,
"numeric_detection" : true,
"properties" : {
"somDate" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"someNumber" : {
"type" : "long"
}
}
}
}
}
可见模板2起作用了: somDate被识别为text而非date; someNumber被识别为long而非text了;我们再看看关于
默认的话,somDate是会被识别为date
, someNumber会被识别为text
的!
shards
和replicas
的数量,谁的起作用了:GET test_template_index/_settings
看看结果:两个都是1
{
"test_template_index" : {
"settings" : {
"index" : {
"creation_date" : "1650989910135",
"number_of_shards" : "1",
"number_of_replicas" : "1",
"uuid" : "HdvbZrC8SwCH9xA3CbzFxg",
"version" : {
"created" : "7050299"
},
"provided_name" : "test_template_index"
}
}
}
}
看来这个是模板1
起作用了,order大的被选择了!
所以结论:- 多个模板匹配的话,都会启用
- 最后将所有配置merge, order大的会覆盖小的中的配置;
主要用来动态设定字段类型:根据ES识别的数据类型,结合3.2 动态模板注意字段名称
来动态设定字段类型。
举例:
- 设置所有字符串类型都为
keyword
, 或者关闭text类型的keyword
子字段;- is开头的字段都设定为
boolean
;- long_开头的字段都设定为
long
类型;
- 是定义在
某个索引
的mappings
中--> 区别于index template; - template有一个名称;
- 匹配规则为一个数组;
- 为匹配字段设置 mapping;
指定某个索引的is*识别为boolean;字符串都设为keyword
例1-动态模板设定:
PUT my_dynamic_template_index
{
"mappings": {
"dynamic_templates": [
{
"is_x_to_boolean": { // 自定义名称
"match_mapping_type": "string",
"match": "is*",
"mapping": {
"type": "boolean"
}
}
},
{
"string_to_keyword": { // 自定义名称
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
]
}
}
注意:
dynamic_templates
是个数组,其中每个对象是一个动态模板,每个模板有一个自定义的名字:例1-动态模板测试:
PUT my_dynamic_template_index/_doc/1
{
"firstName":"Nie", "isVip":"true"
}
查看mapping:
GET my_dynamic_template_index/_mapping
结果:
{
"my_dynamic_template_index" : {
"mappings" : {
"dynamic_templates" : [
{
"is_x_to_boolean" : {
"match" : "is*",
"match_mapping_type" : "string",
"mapping" : {
"type" : "boolean"
}
}
},
{
"string_to_keyword" : {
"match_mapping_type" : "string",
"mapping" : {
"type" : "keyword"
}
}
}
],
"properties" : {
"firstName" : {
"type" : "keyword"
},
"isVip" : {
"type" : "boolean"
}
}
}
}
}
【实践004-elasticsearch之Index Template和Dynamic Template】可以看到起作用了。
推荐阅读
- elasticsearch mapping
- ElasticSearch5.4.3离线搭建
- spring data整合elasticsearch的applicationContext.xml文件模板
- elasticsearch的mapping和analysis
- elasticsearch index 之 put mapping
- ElasticSearch添加mapping
- elasticsearch index 之 Mapping
- PassJava 开源项目(二十)之 详解 Elasticsearch 高级检索玩法
- 如何建立ElasticSearch里的mappings()