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 能在写入阶段就暴露问题。