映射与字段类型
用途:设计索引结构、避免“动态映射把字段类型猜错”造成的返工
核心类型选择
「核心类型选择」小节链接| 类型 | 用途 | 注意 |
|---|---|---|
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 权威指南》(映射设计章节)