大多数时候对单个字段的聚合查询还是非常快的, 但是当需要同时聚合多个字段时,就可能会产生大量的分组,最终结果就是占用 Elasticsearch大量内存,从而导致 OOM 的情况发生。 实践应用发现,以下情况都会比较慢:
"collect_mode" : "breadth_first"
复制
"execution_hint": "map"
复制
国内解释最详细的版本来自Wood大叔:
Map方式的结论可简要概括如下: 1)查询结果直接放入内存中构建map,在查询结果集小的场景下,速度极快; 2)但如果待结果集合很大的情况,map方式不一定也快。
优化方案N:
待进一步深入实践......
聚合的平衡点是多少呢?
场景一:在近亿的document中,检索满足给定条件的数据,并对聚合结果全量聚合。 场景二:在百万级别的document中,全量聚合。 场景三:在近亿级别的document中,全量聚合。
POST index_*/_search { "sort": [ { "nrply": "desc" } ], "aggs": { "count_over_sin": { "terms": { "field": "sin_id", "execution_hint": "map", "size": 1000, "collect_mode": "breadth_first" } } }, "size":0 }
1)修改索引名称,以获取更多的文档。 2)map模式添加 “execution_hint”: “map”,默认是global_ordinals模式。 3)”size”: 1000,设定聚合取值。
对比场景一与场景二、三,说明:
参考: http://t.cn/R8WI6QD http://t.cn/R8WIKta https://elasticsearch.cn/question/1008 http://t.cn/R8WIpYn