前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Elasticsearch聚合优化 | 聚合速度提升5倍!

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

作者头像
铭毅天下
发布2018-03-20 13:12:23
4.6K0
发布2018-03-20 13:12:23
举报
文章被收录于专栏:铭毅天下铭毅天下

1、聚合为什么慢?

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

  • 1)待聚合文档数比较多(千万、亿、十亿甚至更多);
  • 2)聚合条件比较复杂(多重条件聚合);
  • 3)全量聚合(翻页的场景用)。

2、聚合优化方案探讨

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

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

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

代码语言:javascript
复制
 "execution_hint": "map"

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

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 聚合结果

3.4 结果分析

对比场景一与场景二、三,说明:

  • 当结果集合比较少的时候,map聚合方式明显速度更快,速度提升了接近5倍!
  • 当结果集合比较大的时候(百万——亿级别)的时候,传统的聚合方式会比map方式快。

4、小结

  • global_ordinals是关键字字段( keyword field )的默认选项,它使用 全局顺序(global ordinals) 来动态分配存储区,因此内存使用情况与作为聚合作用域一部分的文档值的数量成线性关系。
  • 只有极少数文档与查询匹配匹配时才应考虑使用map方式。 默认情况下,只有在脚本上运行聚合时才会使用map,因为它们没有序号( ordinals )。否则,基于 顺序(ordinals) 的执行模式会相对更快。

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-02-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 铭毅天下Elasticsearch 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、聚合为什么慢?
  • 2、聚合优化方案探讨
    • 优化方案一:默认深度优先聚合改为广度优先聚合。
      • 优化方案二: 每一层terms aggregation内部加一个 “execution_hint”: “map”。
      • 3、做个实验
        • 3.1 实验场景
          • 3.2 聚合操作
            • 3.3 聚合结果
              • 3.4 结果分析
              • 4、小结
              相关产品与服务
              Elasticsearch Service
              腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档