首页 > 其他分享 >Elasticsearch聚合优化 | 聚合速度提升5倍

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

时间:2022-10-18 21:00:09浏览次数:67  
标签:map 场景 聚合 结果 hint ordinals Elasticsearch 优化


1、聚合为什么慢?

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

2、聚合优化方案探讨

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

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

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

"execution_hint": "map"

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

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


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

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

3.4 结果分析

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

4、小结

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

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

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

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

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

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


和你一起,死磕Elasticsearch

——————————————————————————————————

2018.02.04 16:29 于家中床前

作者:铭毅天下

标签:map,场景,聚合,结果,hint,ordinals,Elasticsearch,优化
From: https://blog.51cto.com/elasticsearch/5768161

相关文章

  • Webpack构建速度优化
    前言当我们的项目越来越大,webpack的配置项越来越多时,构建速度会越来越慢,所以我们需要通过一些配置来提高webpack的构建速度。目录缩小范围noParseIgnorePlugin优化......
  • CVPR2021:IoU优化——在Anchor-Free中提升目标检测精度(附源码)
    计算机视觉研究院专栏作者:Edison_G目前的anchor-free目标检测器非常简单和有效,但缺乏精确的标签分配方法,这限制了它们与经典的基于Anchor的模型竞争的潜力1 简要目前的anch......
  • 千万级别mysql 分库分表后表分页查询优化方案初探
    在实际的软件系统开发过程中,随着使用的用户群体越来越多,表数据也会随着时间的推移,单表的数据量会越来越大。以订单表为例,假如每天的订单量在4万左右,那么一个月的订单量......
  • 细说React组件性能优化
    React组件性能优化最佳实践React组件性能优化的核心是减少渲染真实DOM节点的频率,减少VirtualDOM比对的频率。如果子组件未发生数据改变不渲染子组件。组件卸载前......
  • 关于ES索引被聚合查询导致filedata堵塞 (pressure too high, (smooth) bulk request ci
    今天在生产使用kibana查询了一条聚合语句,因为数据量比较大(40亿+),导致fielddatacache飙升,影响了写入,根据官方文档,进行如下操作:执行命令,查询filedatacache使用比较大的索引......
  • Elasticsearch 6.8.6
     mac;centos;unix; 下载wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.6.tar.gz windows下载(迅雷)​​https://artifacts.elastic.c......
  • Java8Stream的flatmap应用(区别map)-优化嵌套for循环条件筛选
    场景Java8新特性-Stream对集合进行操作的常用API:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126070657前面讲Stream的常用api中讲到map的使用......
  • 京东云 TiDB SQL 优化的最佳实践
    京东云TiDBSQL层的背景介绍从总体上概括TiDB和MySQL兼容策略,如下表:SQL层的架构用户的SQL请求会直接或者通过LoadBalancer发送到京东云TiDBServer,TiDBServer会......
  • datax使用及优化
    datax概述    datax定位:离线同步工具    datax优势:        1.单进程多线程,单机压力大        2.理论上可以打满带宽链接    文档链接:http......
  • mysql sql优化相关[更新中]
    1.慢sql查询。select*frominformation_schema.processlistwherecommandnotin('Sleep')andusernotin('mydba','event_scheduler','repl','binlogbak','syst......