首页/数据/NoSQL 速查/新增字段与更新 mapping
Elasticsearch89 条

新增字段与更新 mapping

已有索引可继续补充新字段:调用 PUT /<index>/_mapping 提交 properties;但已存在字段的类型不能修改,只能新建索引后重建数据。

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

更新 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 核对。

易错点

  • 把 text 字段改成 keyword 会被直接拒绝并提示 mapper cannot be changed,必须重建索引
  • 新增字段不回填历史文档,直接统计该字段会出现大量缺失值,需要 update_by_query 或重索引
  • 字段名写错会静默产生新字段,查询结果为空却看不出原因,提交后要 GET _mapping 校对
  • 日期被自动映射成 text 后无法做范围查询,写入前应显式声明 mapping
  • 别名切换前若新索引还没 refresh 或数据未迁完,会出现短暂查询缺口,切换前先核对 _count

数据来源与参考

  • Elasticsearch Guide: Put mapping API
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌