目录
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/fielddata
API 检查高内存消耗的字段。
6. 底层原理
写入时构建:数据插入时同步生成列式存储文件(
.dvd
和.dvm
)。磁盘存储:默认不加载到内存,按需通过文件系统缓存访问。
不可变性:与倒排索引共享相同的段(Segment)机制,段合并时优化。
总结:doc_values 是 OpenSearch/Elasticsearch 中平衡查询性能与资源消耗的关键设计,尤其适合分析型场景。正确配置可显著提升聚合效率,同时避免不必要的内存开销。