Elasticsearch/OpenSearch 中doc_values的作用
目录
1. 核心作用
2. 适用场景
3. 与 index 参数的对比
4. 典型配置示例
场景 1:仅用于聚合,禁止搜索
场景 2:优化大字段存储
5. 性能调优建议
6. 底层原理
doc_values 是 Elasticsearch/OpenSearch 中用于优化查询和聚合的列式存储结构,其核心作用是为非文本字段(如数值、日期、keyword 等)提供高效、低内存的数据访问方式。
1. 核心作用
-  列式存储:将字段值按列而非行存储,减少磁盘I/O,提升聚合(Aggregation)、排序(Sorting)、脚本计算(Scripting)效率。 
-  替代倒排索引:当字段的 index: false时,仍可通过 doc_values 支持基础查询(但性能较慢)。
-  节省内存:避免将全部字段数据加载到堆内存(Heap),降低 JVM 压力。 
2. 适用场景
-  聚合分析(如 terms、avg)
-  排序(如 sort子句)
-  脚本字段计算(如 script_field)
-  非文本字段的查询(如数值、日期、keyword 的 term查询)
3. 与 index 参数的对比
 
| 特性 | index: true(倒排索引) | doc_values: true(列式存储) | 
|---|---|---|
| 存储方式 | 行存储(文档→词项映射) | 列存储(字段值紧凑排列) | 
| 主要用途 | 快速文本搜索(如 match) | 聚合、排序、非文本查询 | 
| 内存占用 | 高(常驻堆内存) | 低(可基于磁盘操作) | 
| 默认启用 | 是 | 对非 text 字段默认启用 | 
| 修改代价 | 重建索引才能关闭 | 可动态调整(需重建数据) | 
4. 典型配置示例
场景 1:仅用于聚合,禁止搜索
PUT /my_index
{"mappings": {"properties": {"price": {"type": "double","index": false,  // 禁用倒排索引(无法被高效搜索)"doc_values": true  // 允许聚合和排序}}}
}场景 2:优化大字段存储
PUT /logs
{"mappings": {"properties": {"timestamp": {"type": "date","doc_values": true  // 默认已启用,显式声明便于理解},"raw_data": {"type": "text","doc_values": false  // text 类型不支持 doc_values}}}
}5. 性能调优建议
-  禁用不必要的 doc_values: 
 若字段无需参与聚合/排序,设置"doc_values": false可节省磁盘空间(如仅用于检索的 text 字段)。
-  结合 index: false使用:
 对纯聚合字段关闭倒排索引,减少内存占用。
-  监控字段数据内存: 
 通过_stats/fielddataAPI 检查高内存消耗的字段。
6. 底层原理
-  写入时构建:数据插入时同步生成列式存储文件( .dvd和.dvm)。
-  磁盘存储:默认不加载到内存,按需通过文件系统缓存访问。 
-  不可变性:与倒排索引共享相同的段(Segment)机制,段合并时优化。 
总结:doc_values 是 OpenSearch/Elasticsearch 中平衡查询性能与资源消耗的关键设计,尤其适合分析型场景。正确配置可显著提升聚合效率,同时避免不必要的内存开销。
