Elasticsearch如何实现聚合优化

这篇文章主要为大家展示了“Elasticsearch如何实现聚合优化”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Elasticsearch如何实现聚合优化”这篇文章吧。

1、聚合为什么慢?

大多数时候对单个字段的聚合查询还是非常快的, 但是当需要同时聚合多个字段时,就可能会产生大量的分组,最终结果就是占用 Elasticsearch大量内存,从而导致 OOM 的情况发生。 
实践应用发现,以下情况都会比较慢: 

  • 1)待聚合文档数比较多(千万、亿、十亿甚至更多); 

  • 2)聚合条件比较复杂(多重条件聚合); 

  • 3)全量聚合(翻页的场景用)。

2、聚合优化方案探讨

优化方案一认深度优先聚合改为广度优先聚合。

"collect_mode" : "breadth_first"
  • depth_first 直接进行子聚合的计算

  • breadth_first 先计算出当前聚合的结果,针对这个结果在对子聚合进行计算。

优化方案二: 每一层terms aggregation内部加一个 “execution_hint”: “map”。

 "execution_hint": "map"

国内解释最详细的版本来自Wood大叔: 

Elasticsearch如何实现聚合优化


Map方式的结论可简要概括如下: 
1)查询结果直接放入内存中构建map,在查询结果集小的场景下,速度极快; 
2)但如果待结果集合很大的情况,map方式不一定也快。

优化方案N

待进一步深入实践......

3、做个实验

聚合的平衡点是多少呢?

3.1 实验场景

场景一:在近亿的document中,检索满足给定条件的数据,并对聚合结果全量聚合。 
场景二:在百万级别的document中,全量聚合。 
场景三:在近亿级别的document中,全量聚合。

3.2 聚合操作

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,设定聚合取值。

3.3 聚合结果

Elasticsearch如何实现聚合优化

以上是“Elasticsearch如何实现聚合优化”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程之家行业资讯频道!

相关文章

支付宝万能福可以替代任何福字,没有集齐五福的用户快来试试...
TV盒子助手是一款可以远程管理智能电视、电视盒子的应用,主...
Kindle无法导入电子书怎么办?Kindle电子书阅读器是一款非常...
蓝奏云是现在很多用户下载资源时都会遇到的一款网盘,用户体...
华为Mate20怎么设置触摸屏幕亮屏?对于全面屏的手机来说,苹...
华为怎么关闭锁屏杂志?华为手机在屏幕锁定之后再次打开会看...