mapping 参数控制什么
mapping 里的字段类型决定「值怎么解析」,字段级参数决定「值怎么索引和存储」:index 控制是否建倒排索引,doc_values 控制是否建列式存储,ignore_above 控制长字符串的截断,null_value 给 null 一个可索引的替代值,format 约定日期的解析格式。这些参数大多要在建索引时定下来,字段已经写入数据后再改往往要新建索引重建。
基本信息
| index | false 时不建倒排索引,字段不可检索,但仍在 _source 里 |
|---|---|
| doc_values | false 时不建列存,不能排序与聚合,可省磁盘;默认为 true |
| ignore_above | keyword 字段超过该长度的值不建索引,防止索引膨胀 |
| null_value | 把 JSON null 替换成一个可索引的默认值 |
| format | 日期解析格式,可用 || 组合多个,如 epoch_millis||strict_date_optional_time |
| 适用版本 | Elasticsearch 7.x / 8.x 参数名一致 |
典型使用场景
- 只回显不检索的大字段(原始报文、调试信息)用 index:false 省索引空间
- 可能超长的 trace_id、URL 用 ignore_above 截断,避免索引被长值撑大
- 确定需要排序与聚合的字段必须保留 doc_values
- 时间字段格式不统一时用 format 显式声明,避免动态映射把日期识别成字符串
- 用 null_value 让缺失值也能参与范围查询与排序
常用参数示例
常用参数示例
# 给已有索引追加字段级参数
PUT /metrics-000001/_mapping
{
"properties": {
"debug_payload": { "type": "keyword", "index": false }, # 只回显不检索
"sample_raw": { "type": "double", "doc_values": false }, # 不排序不聚合
"trace_id": { "type": "keyword", "ignore_above": 128 }, # 超长值不建索引
"ts": { "type": "date", "format": "epoch_millis||strict_date_optional_time" },
"region": { "type": "keyword", "null_value": "unknown" }
}
}
# 确认参数是否生效
GET /metrics-000001/_mapping
GET /_cat/fielddata?v # 查看字段数据占用(fielddata 只在特定场景用)常用参数与代价
| 参数 | 作用 | 代价 / 注意 |
|---|---|---|
| index: false | 不建倒排索引,字段不可检索 | 对该字段查询永远无命中且不报错 |
| doc_values: false | 不建列式存储,节省磁盘 | 不能排序、聚合,也不能在脚本中取值 |
| ignore_above: N | 超长字符串不建入索引 | 超长值无法精确匹配与聚合 |
| null_value: v | null 索引成替代值 v | 只影响索引,_source 里仍是 null |
| format | 约定日期解析格式 | 格式写错会导致整个文档写入被拒 |
| fields 多字段 | 同一字段用不同方式索引 | 每个子字段都额外占用索引空间 |
index:false 与 doc_values:false 都是省空间的常用手段,但都会永久性丧失字段能力:前者不能检索,后者不能排序聚合;只应对确认不回查的字段使用,并在 mapping 注释里标明用途。