目錄
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/fielddata
?API 檢查高內存消耗的字段。
6. 底層原理
-
寫入時構建:數據插入時同步生成列式存儲文件(
.dvd
?和?.dvm
)。 -
磁盤存儲:默認不加載到內存,按需通過文件系統緩存訪問。
-
不可變性:與倒排索引共享相同的段(Segment)機制,段合并時優化。
總結:doc_values 是 OpenSearch/Elasticsearch 中平衡查詢性能與資源消耗的關鍵設計,尤其適合分析型場景。正確配置可顯著提升聚合效率,同時避免不必要的內存開銷。