ElasticSearch 动态映射实战详解
作者:程序员皮卡秋
什么是动态映射
通俗的讲,就是文档中的字段类型可以由ES
动态识别,无需在创建索引的时候规定字段的类型。
比如在项目中,如果不确定字段数据类型的情况下,可以使用动态映射
,ES
可以利用动态映射来决定该字段的类型,并自动把该字段添加到映射中。
在使用的时候要结合实际业务来考虑,如果将 ES
当作主要的数据存储使用,并且希望出现未知字段时抛出异常,那么开启动态 mapping 并不适用。
***在不确定索引类型字段时,可以先创建临时索引,然后存储数据,查询映射。再删除临时索引。这样就得到数据的基本映射了,可以在其上做精细化修改。 ***
映射规则
null
没有字段被添加true or false
boolean 类型浮点类型数字
float 类型数字
long 类型JSON 对象
object 类型数组
由数组中第一个非空值决定string
有可能是 date 类型(若开启日期检测)、double 或 long 类型、text 类型、keyword 类型
在 mapping 中可以通过 dynamic 设置来控制是否自动新增字段,接受以下参数:
- true:默认值为 true,自动添加字段。
- false:忽略新的字段。
- strict:严格模式,发现新的字段抛出异常。
日期规则
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或动态类型 当然也可以直接强制指定类型和属性
下面看一些示例:
match_mapping_type
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 } } } } } ] } }
match、unmatch
PUT my_index { "mappings": { "dynamic_templates": [ { "longs_as_strings": { "match": "long_*", "unmatch": "*_text", "mapping": { "type": "long" } } } ] } }
match_pattern
{ "mappings": { "dynamic_templates": [ { "longs_as_strings": { "match_pattern": "regex", "match": "^profit_\d+$", "unmatch": "*_text", "mapping": { "type": "long" } } } ] } }
path_match、path_unmatch
{ "mappings": { "dynamic_templates": [ { "full_name": { "path_match": "name.*", "path_unmatch": "*.middle", "mapping": { "type": "text", "copy_to": "full_name" } } } ] } }
{name}、{dynamic_type}
{ "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操作
。
以上就是ElasticSearch 动态映射实战详解的详细内容,更多关于ElasticSearch 动态映射的资料请关注脚本之家其它相关文章!