欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > 重生之我们在ES顶端相遇第6 章- Dynamic Mapping(动态映射)

重生之我们在ES顶端相遇第6 章- Dynamic Mapping(动态映射)

2025/11/12 13:09:45 来源:https://blog.csdn.net/qq_32880923/article/details/140568336  浏览:    关键词:重生之我们在ES顶端相遇第6 章- Dynamic Mapping(动态映射)

思维导图

在这里插入图片描述

前言

在第5章,我们说完 ES 常用字段类型。但是,并未跟大家解释,为什么不设置 Mapping,写入的字符串,默认就可以全文搜索。例如

PUT /test4/_doc/1
{"name": "hello world"
}
GET /test4/_search
{"query": {"match_bool_prefix": {"name": {"query": "search wor","operator": "or"}}}
}

这一切都跟 ES 的 dynamic mapping 功能有关。下面我将介绍这一功能。

Dynamic Mapping

可选值介绍

dynamic mapping 默认是开启的。 ES 有以下 4 个可选值

  • • true: 往文档写入新字段时,会自动创建字段类型(默认值)
  • • runtime: 往文档写入新字段时,会自动创建字段类型, 与 true 的区别为,2者字段映射不一样
  • • false: 忽略该字段,无法检索该字段,但是文档中可以看到该字段
  • • strict: 有新字段,则拒绝本次写入
设置 dynamic mapping

创建索引时,手动设置 dynamic 属性值

PUT test4
{"mappings": {"dynamic": "false","properties": {"name": {"type": "text"},"age": {"type": "integer"},"ctime": {"type": "date"}}}
}

修改已存在的索引的 dynamic

PUT test4/_mapping
{"dynamic": true
}
字段映射默认值
JSON date type“dynamic”:“true”“dynamic”:“runtime”
null不添加字段不添加字段
truefalsebooleanboolean
doublefloatdouble
longlonglong
objectobject不添加字段
array以数组中第一个不为空的元素为准以数组中第一个不为空的元素为准
日期字符串(更多见下文 date detection)datedate
数字字符串(更多见下文 number detection)floatlongdoublelong
不匹配日期、数字的字符串text 以及 .keyword 的子字段keyword
回答开篇提出的问题

学习到这里,就可以解释开篇提出的问题了:为什么不设置 Mapping,写入的字符串,默认就可以全文搜索?

因为索引的 dynamic 默认为 true,当输入的非日期、数字字符串时,会被自动映射为 text 以及携带 .keyword 子字段。

DELETE test4
PUT test4/_doc/1
{"name": "hello world"
}
GET test4/_mapping

在这里插入图片描述

Date detection

dete_tection 功能默认启用,即如果添加了一个新的字符串字段,且满足该数据格式 [ "strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"] 则会添加一个 date 字段。

禁用 date detection

创建索引时,设置 date_tection

DELETE test4
PUT test4
{"mappings": {"dynamic": "false","date_detection": false, "properties": {"name": {"type": "text"},"age": {"type": "integer"},"ctime": {"type": "date"}}}
}

修改已存在的索引的 date_tection

PUT test4/_mapping
{"dynamic": true,"date_detection": true
}
自定义 date detection

创建索引时,设置 dynamic_date_formats

DELETE test4
PUT test4
{"mappings": {"dynamic": "false","date_detection": false, "dynamic_date_formats": ["MM/dd/yyyy"],"properties": {"name": {"type": "text"},"age": {"type": "integer"},"ctime": {"type": "date"}}}
}

修改已存在的索引的 dynamic_date_formats

PUT test4/_mapping
{"dynamic": true,"date_detection": true,"dynamic_date_formats": ["MM/dd/yyyy"]
}
Number detection

numeric_detection 默认是被禁用的。

DELETE test4
PUT test4
{"mappings": {"numeric_detection": true}
}

结语

本章介绍了 ES dynamic mapping。下一章,将介绍 ES 的 dynamic template,其可以更好的控制 ES 的字段映射。dynamic template 功能在开发中也相对比较常用。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词