首页/数据/NoSQL 速查/dynamic mapping 动态映射策略
Elasticsearch89 条

dynamic mapping 动态映射策略

dynamic 控制未知字段如何处理:true 自动推断并加入映射,false 不索引但保留在 _source,strict 直接拒绝写入;生产索引建议显式定义映射。

NoSQL 速查数据更新于 2026-10-13

dynamic 动态映射是什么

dynamic 参数控制未知字段如何处理:true 是默认值,按首次出现的值自动推断类型并加入映射;false 让未知字段写入成功但不建索引,也就无法被检索;strict 直接拒绝写入并报错。生产索引建议显式定义映射,再把 dynamic 设为 strict 或 false,避免一条脏数据改变后续所有文档的索引方式。

基本信息

取值true(默认)/ false / strict
true 行为自动推断类型并写入映射
false 行为字段保留在 _source 但不索引,无法检索
strict 行为未知字段直接报错,写入失败
作用范围可设在索引级,也可设在某个对象字段上
适用版本Elasticsearch 7.x / 8.x

典型使用场景

  • 结构化业务数据用 strict 保证写入字段与映射一致
  • 日志类索引允许字段漂移,用 false 避免写入被拒
  • 临时排查阶段先用默认 true 观察字段类型分布
  • 嵌套对象里限制内层字段,把 dynamic 设在对象上
  • 迁移旧索引时用 false 承接历史脏字段
  • 与索引模板配合,让新建索引统一带 dynamic 策略

示例

示例
PUT /events-strict
{
  "mappings": {
    "dynamic": "strict",                 # 未定义字段直接报错
    "properties": {
      "event": { "type": "keyword" },
      "detail": { "type": "object", "dynamic": false }   # 内层允许未知字段但不索引
    }
  }
}

三种取值对照

取值写入行为检索行为
true未知字段自动建映射可以检索,但类型由首条数据决定
false写入成功,不建映射字段不索引,无法检索与聚合
strict写入直接失败报未知字段错误,需先改映射
字符串自动映射会同时生成 text 与 keyword 子字段,keyword 子字段默认 ignore_above 256,超长值不会进索引。
时间字符串是否被识别成日期取决于 date_detection 开关(默认开启),关闭后日期字段需要显式声明类型。
依赖自动映射时一个拼错的字段名会静默产生新字段,之后统计口径混乱;把 dynamic 设为 strict 能在写入阶段就暴露问题。

易错点

  • 依赖自动映射时一个拼错的字段名会静默产生新字段,之后统计口径混乱却难以定位
  • dynamic 设为 false 后新字段不报错,排查查询无结果时要先 GET _mapping 确认字段是否真的存在
  • 首条数据决定字段类型,之后类型冲突的文档会被拒绝写入,业务上线前应显式定义映射
  • 把 dynamic 设成 strict 却没同步更新写入方字段清单,会造成整批写入失败
  • 对象数组用普通 object 加自动映射会跨元素串位,需要成组匹配时必须显式声明 nested

数据来源与参考

  • Elasticsearch Guide: Dynamic field mapping
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌