动态模板
在我们最开始使用ES的时候,可能还不太了解mapping,也没有添加过mapping为什么我们还是能够正常的添加文档。
那是因为ES可以动态映射,添加文档的时候遇到没有的字段,可以动态的添加到mapping中
动态模板,英文名为Dynamic Templates,是根据Elasticsearch可识别的数据类型,结合字段名称,来动态设定字段类型的一种机制。
自动识别规则
首先es可以自动识别文档字段的类型,这样可以降低用户的使用成本。
es是依靠json文档的字段类型来实现自动识别字段类型的:
json类型 :es类型
null : 忽略
boolean : boolean
浮点 : float
整数 : long
object : object
array : 第一个非null值类型决定
string : 匹配为日志则是date类型(默认开启),匹配为数字的话自动为 float或long类型(默认关闭),否则为text类型,附带keyword子字段
自定义动态模板
1、 根据字段类型mapping
根据字段类型匹配通过 match_mapping_type 属性来控制,当添加文档的时候,ES的JsonParser解析出来的类型是match_mapping_type指定的类型,就会使用对应的mapping
2、 根据字段名称mapping
根据字段名称映射使用的是 match、unmatch、match_pattern 属性来控制。
3、根据字段路径mapping
按路径匹配使用的是 path_match、path_unmatch 属性来指定。
动态mapping的添加方式
添加动态索引有2种方式:
第一种就是为索引添加mapping的时候同时指定动态映射的mapping。
第二种就是在索引模板中指定。
下面我们就来看一下在设置索引模板的时候指定。
索引模板
索引模板,英文名为Index Template。它是一种机制,这种机制允许我们定义一种模板,这种模板当新索引创建时将被自动应用。模板包含settings
和mapping
,以及这个模板是否可被应用于新的索引。
索引模板有以下限制:
- 索引模板仅在一个索引新创建时才起作用,修改模板不会影响已创建的索引。
- 可以设定多个索引模板,这些索引模板的设置将被
merge
在一起。 - 可以通过对索引模板指定
order
的数值,来控制merge
的过程。
模板定义可以如下:
{ "order": 0, // 模板优先级,数字越大优先级越高 "index_patterns": ["test*,user*"], // 匹配该模板的索引名称正则 "settings": {}, // 索引设置 "mappings": {}, // 索引中各字段的映射定义 "aliases": {} // 索引的别名 }
order:当索引名称匹配到多个索引模板的时候,换选择order值大的
模板优先级:
1.应用Elasticsearch默认的settings
和mappings
。
2.应用 order 数值低的索引模板中的设置。
3.应用 order 数值高的索引模板中的设置
4.应用索引创建时,用户指定的settings
和mappings
index_patterns:索引名称匹配表达式,例如,所用以名称以test开头的都可以匹配到test*
settings:索引配置
mappings:默认的mapping