Elasticsearch聚合优化 | 聚合速度提升5倍

1、聚合为什么慢?

大多数时候对单个字段的聚合查询还是非常快的, 但是当需要同时聚合多个字段时,就可能会产生大量的分组,最终结果就是占用 es 大量内存,从而导致 OOM 的情况发生。
实践应用发现,以下情况都会比较慢:
1)待聚合文档数比较多(千万、亿、十亿甚至更多);
2)聚合条件比较复杂(多重条件聚合);
3)全量聚合(翻页的场景用)。

2、聚合优化方案探讨

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

"collect_mode" : "breadth_first"
  • depth_first 直接进行子聚合的计算
  • breadth_first 先计算出当前聚合的结果,针对这个结果在对子聚合进行计算。

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

 "execution_hint": "map"

国内解释最详细的版本来自Wood大叔:
这里写图片描述
Map方式的结论可简要概括如下:
1)查询结果直接放入内存中构建map,在查询结果集小的场景下,速度极快;
2)但如果待结果集合很大的情况,map方式不一定也快。

3、做个实验

聚合的平衡点是多少呢?

3.1 实验场景

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

3.2 聚合操作

POST index_*/_search
{
  "sort": [
  {
  "nrply": "desc"
  }
  ],
  "aggs": {
  "count_ix": {
  "terms": {
  "field": "ix_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 聚合结果

这里写图片描述

3.4 结果分析

对比场景一与场景二、三,说明:
1)当结果集合比较少的时候,map聚合方式明显速度更快,速度提升了接近5倍!
2)当结果集合比较大的时候(百万——亿级别)的时候,传统的聚合方式会比map方式快。

4、小结

1)global_ordinals是关键字字段( keyword field )的默认选项,它使用 全局顺序(global ordinals) 来动态分配存储区,因此内存使用情况与作为聚合作用域一部分的文档值的数量成线性关系。

2)只有极少数文档与查询匹配匹配时才应考虑使用map方式。
默认情况下,只有在脚本上运行聚合时才会使用map,因为它们没有序号( ordinals )。

否则,基于 顺序(ordinals) 的执行模式会相对更快。

参考:
http://t.cn/R8WI6QD
http://t.cn/R8WIKta
https://elasticsearch.cn/question/1008
http://t.cn/R8WIpYn

——————————————————————————————————
更多ES相关实战干货经验分享,请扫描下方【铭毅天下】微信公众号二维码关注。
(每周至少更新一篇!)

这里写图片描述
和你一起,死磕Elasticsearch
——————————————————————————————————

2018.02.04 16:29 于家中床前

作者:铭毅天下
转载请标明出处,原文地址:
http://blog.csdn.net/laoyang360/article/details/79253294
如果感觉本文对您有帮助,请点击‘顶’支持一下,您的支持是我坚持写作最大的动力,谢谢!

  • 20
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
您好!对于Elasticsearch聚合速度慢的问题,有几个可能的原因和解决方案可以尝试: 1. 数据量过大:如果您的索引中包含大量的文档,聚合操作可能会变得缓慢。您可以尝试通过分片和副本的方式来优化索引的性能。增加分片数量可以提高并行处理能力,而增加副本数量可以提高读取性能。 2. 查询复杂度高:某些聚合操作可能需要对大量文档进行计算和排序,导致速度变慢。您可以尝试优化查询条件,减少计算和排序的工作量。例如,可以限制查询的时间范围、缩小查询结果的范围,或者使用缓存来加速聚合操作。 3. 硬件资源不足:如果您的Elasticsearch集群的硬件资源(如CPU、内存、磁盘)不足,可能也会导致聚合操作变慢。您可以考虑升级硬件或增加节点数量来提高性能。 4. 优化聚合操作:Elasticsearch提供了多种聚合操作,不同的操作可能有不同的性能表现。您可以尝试使用更适合您需求的聚合操作,或者对聚合操作进行优化。例如,可以使用近似聚合方法(例如基数估计、采样)来加速聚合操作。 5. 使用缓存:如果某些聚合操作的结果可以被缓存并重复使用,可以考虑使用Elasticsearch的缓存功能来加速查询。这样可以避免每次都重新计算聚合结果。 希望这些解决方案对您有所帮助!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铭毅天下

和你一起,死磕Elastic!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值