更新 mapping 是什么
已有索引可以继续补充新字段:PUT /<index>/_mapping 提交 properties 就能新增字段、给字段加子字段,或新增查询期计算的 runtime 字段。但已存在字段的类型不能修改,被拒绝后只能新建索引再用 _reindex 迁移。映射定义了字段如何被索引与查询,一旦确定就长期影响检索、排序与聚合方式。
基本信息
| 接口 | PUT /<index>/_mapping |
|---|---|
| 可做 | 新增字段、加 multi-field 子字段、新增 runtime 字段 |
| 不可做 | 修改已有字段类型,会直接返回错误 |
| 查看方式 | GET /<index>/_mapping |
| 语义 | 增量合并,未提及的字段定义保持不变 |
| 适用版本 | Elasticsearch 7.x / 8.x |
典型使用场景
- 业务新增字段却不想重建索引,直接补映射
- 给已有 text 字段追加 keyword 子字段用于聚合与排序
- 临时分析需求用 runtime 字段在查询期计算,不改索引结构
- 核对自动推断出的类型是否符合预期,日期被误判成 text 很常见
- 用元信息记录字段用途与负责人,便于长期维护
- 把确认好的映射固化进索引模板,避免新索引继承错误类型
示例
示例
PUT /my-index-000001/_mapping
{
"properties": {
"email": { "type": "keyword" }, # 新增字段
"age": { "type": "integer" },
"city": {
"type": "text", # 给已有字段补 keyword 子字段
"fields": { "raw": { "type": "keyword", "ignore_above": 256 } }
}
}
}
GET /my-index-000001/_mapping # 核对最终映射操作可行性对照
| 操作 | 是否支持 | 说明 |
|---|---|---|
| 新增字段 | 支持 | 新写入的文档按新映射索引 |
| 增加子字段 | 支持 | 历史数据需 reindex 后子字段可查 |
| 修改字段类型 | 不支持 | 报 mapper cannot be changed |
| 删除字段定义 | 不支持 | 只能新建索引重建 |
| 新增 runtime 字段 | 支持 | 查询期计算,不占索引空间 |
新增字段不会回填历史文档:旧文档该字段仍缺失,需要重建索引或用 update_by_query 补写才会有值。
改类型只能走重建路线:先建好新索引(带正确映射),用 _reindex 搬数据,核对数量后切换别名,最后再删除旧索引。
PUT _mapping 是增量合并,不会删掉未提及的字段;但字段名打错会静默新增一个字段,之后查询空值却难以定位,提交前后都要 GET 核对。