什么是动态映射
通俗的讲,就是文档中的字段类型可以由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 动态映射的资料请关注编程网其它相关文章!