跳转到内容

映射与字段类型

用途:设计索引结构、避免“动态映射把字段类型猜错”造成的返工

类型 用途 注意
text 全文检索 不可排序/聚合(除非开 fielddata,代价高)
keyword 精确值、枚举、ID、聚合排序 长文本不适合(词典膨胀)
date 时间 明确 format 与时区,存 UTC
long/double/integer... 数值 范围查询友好;dense_vector/geo_point 等特殊类型按需
boolean 开关 与“三态”字段区分(未知/是/否)
object 嵌套对象(默认按扁平化处理) 数组内多对象字段会被“交叉”,需要关联时用 nested
nested 数组内对象保持整体关联 查询用 nested query;子文档独立索引,代价是写放大
join 父子文档 限制多(路由、聚合),谨慎使用
flattened 未知结构整体存储 只按 key 精确匹配,不做类型推断
alias / runtime 别名与运行时字段 运行时字段省存储但查询慢

首条文档写入时 ES 会猜类型:"1" 可能被识别成 text,之后真实数值写入就报错或行为异常。生产索引必须显式定义 mapping,并设置:

{ "dynamic": "strict" } // 或 false:新增字段直接报错/忽略,避免字段爆炸

字段数上限(默认 1000)被击穿会导致整索引写入失败——日志类字段动态展开是常见诱因。

参数 作用 建议
index: false 不建倒排,只存储 只用于返回展示的大字段,省空间
doc_values: false 不建正排列存 明确不排序/聚合的 text 字段可关
norms 字段长度归一化 不需要打分的字段关闭
index_options: docs/freqs 是否记录词频与位置 不需要短语与打分时可降为 docs
ignore_above 超长 keyword 不索引 防脏数据撑爆词典
copy_to 多字段合并到一个检索字段 简化综合搜索
null_value null 的替代值 让“缺失”可被过滤
fielddata text 上启用正排 几乎永远不该开

已存在字段的类型不能改,只能:新建索引 + _reindex(或双写切换)+ 别名切换。因此索引命名要带版本(v1/v2),并用别名对外暴露,实现无感切换。

  • 用 index template 统一 mapping/settings,避免每个索引手工配置。
  • 时间序列索引(日志、事件)用 data stream + ILM(热-温-冷-删除)管理。
误区 修正
依赖动态映射 显式 mapping + dynamic: strict
用 object 存对象数组后按“同一对象内条件”查询 改 nested
想改字段类型就 PUT mapping 不支持,需 reindex
所有字段都 text + keyword 索引体积与写放大,按需
用 LIKE 思维设计搜索字段 明确是词项检索还是子串检索
直接暴露索引名给应用 用别名,便于切换与重建
  • Elasticsearch 官方文档:Mapping、Field types、Dynamic mapping、Nested
  • 《Elasticsearch 权威指南》(映射设计章节)