Elasticsearch/OpenSearch 中doc_values的作用

发布于:2025-05-17 ⋅ 阅读:(14) ⋅ 点赞:(0)

目录

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. 适用场景

  • 聚合分析(如 termsavg

  • 排序(如 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 中平衡查询性能与资源消耗的关键设计,尤其适合分析型场景。正确配置可显著提升聚合效率,同时避免不必要的内存开销。


网站公告

今日签到

点亮在社区的每一天
去签到