通俗的讲,就是文档中的字段类型可以由ES
动态识别,无需在创建索引的时候规定字段的类型。
比如在项目中,如果不确定字段数据类型的情况下,可以使用动态映射
,ES
可以利用动态映射来决定该字段的类型,并自动把该字段添加到映射中。
在使用的时候要结合实际业务来考虑,如果将 ES
当作主要的数据存储使用,并且希望出现未知字段时抛出异常,那么开启动态 mapping 并不适用。
***在不确定索引类型字段时,可以先创建临时索引,然后存储数据,查询映射。再删除临时索引。这样就得到数据的基本映射了,可以在其上做精细化修改。 ***
null
没有字段被添加true or false
boolean 类型浮点类型数字
float 类型数字
long 类型JSON 对象
object 类型数组
由数组中第一个非空值决定string
有可能是 date 类型(若开启日期检测)、double 或 long 类型、text 类型、keyword 类型在 mapping 中可以通过 dynamic 设置来控制是否自动新增字段,接受以下参数:
es中当字符串的格式为:yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z
时,es动态模板会自动认为该字符串为日志类型
date_detection
来关闭日期模板匹配dynamic_date_formats
来指定日期字符匹配模板PUT my_index { "mappings": { "dynamic_date_formats": ["MM/dd/yyyy"] } }
动态映射有时会将数字映射为字符串类型,可以通过开启数字检测来解决该问题
PUT my_index { "mappings": { "numeric_detection": true } }
定义动态映射模板,来格式化动态映射的规则,动态映射模板包含以下关键字:
match_mapping_type
:用来匹配当前映射的字段类型。可以理解为,当字段类型为match_mapping_type时match、unmatch 、match_pattern
:用来匹配当前映射字段的名称。可以理解为,当字段名称匹配match、match_pattern
时,当字段名称不匹配unmatch
时path_match、path_unmatch
:用来匹配当前映射字段的路径,通常用来匹配嵌套字段。可以理解为,当字段路径为path_match
时,当字段路径不匹配path_unmatch
时{name}, {dynamic_type}
:用来进行占位符匹配,具体怎么用,都可以,但是最终映射的值为name或动态类型 当然也可以直接强制指定类型和属性下面看一些示例:
dynamic_templates
是动态模板名称,什么字段都可以。integers
与strings
时动态模板项名称
PUT my_index { "mappings": { "dynamic_templates": [ { "integers": { "match_mapping_type": "long", "mapping": { "type": "integer" } } }, { "strings": { "match_mapping_type": "string", "mapping": { "type": "text", "fields": { "raw": { "type": "keyword", "ignore_above": 256 } } } } } ] } }
PUT my_index { "mappings": { "dynamic_templates": [ { "longs_as_strings": { "match": "long_*", "unmatch": "*_text", "mapping": { "type": "long" } } } ] } }
{ "mappings": { "dynamic_templates": [ { "longs_as_strings": { "match_pattern": "regex", "match": "^profit_\d+$", "unmatch": "*_text", "mapping": { "type": "long" } } } ] } }
{ "mappings": { "dynamic_templates": [ { "full_name": { "path_match": "name.*", "path_unmatch": "*.middle", "mapping": { "type": "text", "copy_to": "full_name" } } } ] } }
{ "mappings": { "dynamic_templates": [ { "named_analyzers": { "match_mapping_type": "string", "match": "*", "mapping": { "type": "text", "analyzer": "{name}" } } }, { "no_doc_values": { "match_mapping_type":"*", "mapping": { "type": "{dynamic_type}", "doc_values": false } } } ] } }
{ "mappings": { "dynamic_templates": [ { "strings_as_keywords": { "match_mapping_type": "string", "mapping": { "type": "keyword" } } } ] } }
索引模板
的作用是提前创建好模板,后续索引的创建会根据匹配规则,自动生成该索引的配置
merge
在一起。order
的数值,控制 merge
的过程。当一个索引被创建时,如果符合多个模板,那么模板之间merge
符合以下规则:
order
值高的模板会覆盖 order
值低的模板。感兴趣的同学,可以自行去查询相关文档,这个不是很常用
本节主要讲了ES中的动态mapping
概念以及它的相关属性。下节给大家讲ES中文档相关的API操作
。