大数据-184 Elasticsearch Doc Values 机制详解

1. 什么是 Doc Values

Doc Values 是索引时生成的磁盘列式存储数据结构,专门为排序、聚合、脚本取值优化。

  • 与 fielddata(内存)相比,doc values 更节省内存
  • 写入时生成,查询时从磁盘读取

2. 默认行为

默认开启的类型

  • numeric
  • date
  • IP
  • keyword
  • 等等

默认关闭的类型

  • text:不提供 doc values(因为 text 被分词,不适合聚合/排序)

3. Text 字段如何聚合/排序

3.1 方案一:keyword 子字段

{
  "content": {
    "type": "text",
    "fields": {
      "keyword": {
        "type": "keyword"
      }
    }
  }
}

使用 content.keyword 进行聚合/排序。

3.2 方案二:启用 fielddata

{
  "content": {
    "type": "text",
    "fielddata": true
  }
}

注意:fielddata 加载到堆内存,对大字段有严重内存压力,谨慎使用。

4. 禁用 Doc Values

对于不需要排序/聚合/脚本的字段,可以禁用:

{
  "my_field": {
    "type": "keyword",
    "doc_values": false
  }
}

5. 注意事项

  • Mapping 不能随意修改,修改需要重建索引
  • 字段类型一旦确定,很难更改

6. 总结

  • Doc Values 是磁盘列式存储
  • 大多数类型默认开启
  • text 字段需要用 keyword 子字段或 fielddata 才能聚合/排序