Elasticsearch对不存在字段执行aggregation操作耗时过长原因问询
Elasticsearch 对不存在字段执行聚合操作耗时过长的成因
核心原因主要有三点:
- 倒排索引过滤能力无法发挥
你添加status code字段必须存在的过滤条件时,ES可以直接通过status code字段的倒排索引,快速定位到所有包含该字段的文档ID集合,后续aggregation操作仅需要处理这部分小范围的文档。如果没有这层过滤,ES需要扫描索引内的全量文档,无法利用倒排索引的跳过特性,扫描量级直接上升到整个索引的文档总数。 - doc values 扫描开销差异
ES的聚合逻辑默认依赖doc values列式存储完成计算。对于不存在status code字段的文档,doc values中会存储默认占位值。无过滤条件时,ES需要遍历全量文档的doc values,同时处理占位值和实际的status code值;加了过滤条件后,仅需要扫描包含有效status code的文档对应的doc values,IO开销和计算量都会下降一个数量级。 - 空值归类额外开销
如果你的索引没有为status code字段提前配置null_value映射,ES在聚合时需要逐文档判断是否存在该字段,将不存在的文档统一归入null分组。无过滤条件时全量文档都要经过这层判断逻辑,会带来额外的CPU开销。
内容的提问来源于stack exchange,提问作者bw tang
相关产品推荐
相关产品推荐

