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

news2024/11/19 11:20:55

1、聚合为什么慢?

大多数时候对单个字段的聚合查询还是非常快的, 但是当需要同时聚合多个字段时,就可能会产生大量的分组,最终结果就是占用 Elasticsearch大量内存,从而导致 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方式不一定也快。

优化方案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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1375671.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git入门之本地操作

1、启动git命令输入 在想要建立仓库,建议的方式是在文件夹中右键单击,选择git bash here 2、初始化仓库命令:git init 3、查看仓库状态:git status 4、更新仓库特定文件:git add xxx 5、更新仓库所有文件&#xff1…

【机器学习】聚类算法(二)

五、基于密度的算法 5.1 DBSCAN 算法 import sys # 导入 sys 模块,用于访问系统相关的参数和功能 import os # 导入 os 模块,用于处理文件和目录 import math # 导入 math 模块,用于进行数学运算 import random # 导入 random 模块&#xff0…

JVM基础(5)——JVM垃圾回收算法

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖&…

【机器学习】模型调参工具:Hyperopt 使用指南

机器学习| 模型调参工具:Hyperopt 使用指南 前言1. Hyperopt是什么?2. Hyperopt的优缺点3. 如何使用 Hyperopt 进行调参3.1 安装 Hyperopt3.2 构建超参数空间3.3 定义目标函数3.4 运行 Hyperopt 优化3.5 获取最优超参数 4. XGB调参代码示例参考资料 前言…

Java Http各个请求类型详细介绍

1. 前言 在Spring Boot框架中,HTTP请求类型是构建Web应用程序的重要组成部分。常见的请求类型包括GET、POST、PUT和DELETE,每种类型都有其特定的用途和特点。本文将详细比较这四种请求类型,帮助您在开发过程中做出明智的选择。 2. GET请求…

12.扩展字典(ExtensionDictionary)

愿你出走半生,归来仍是少年! 环境:.NET FrameWork4.5、ObjectArx 2016 64bit、Entity Framework 6. 在10.扩展数据(XData)中我们讲到每个DbObject有一个XData对象可以存储数据,除此之外每个DbObject对象还有一个ExtensionDictionary(扩展字典)可以进行数据存储。…

vue3+ts+vite中封装axios,使用方法从0到1

一、安装axios npm install axios types/axios --save二、配置代理vite.config.ts,如果没有需要新建该文件 module.exports {server: {proxy: {/api: {target: http://localhost:5000, // 设置代理目标changeOrigin: true, // 是否改变请求源地址rewrite: (path)…

【开源】基于JAVA+Vue+SpringBoot的大病保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统配置维护2.2 系统参保管理2.3 大病保险管理2.4 大病登记管理2.5 保险审核管理 三、系统详细设计3.1 系统整体配置功能设计3.2 大病人员模块设计3.3 大病保险模块设计3.4 大病登记模块设计3.5 保险审核模块设计 四、…

写点东西《Docker入门(上)》

写点东西《Docker入门(上)》 环境变量 Docker 镜像 Docker CMD 与 ENTRYPOINT 有什么区别 Docker 中的网络: Docker 存储: Docker 是一个工具,允许开发人员将他们的应用程序及其所有依赖项打包到一个容器中。然后&…

SQL--case语句

case语句,按从上到下的书写顺序计算每个WHEN子句的布尔表达式。返回第一个取值为TRUE的布尔表达式所对应的结果表达式的值。如果没有取值为TRUE的布尔表达式,则当指定了ELSE子句时,返回ELSE子句中指定的结果;如果没有指定ELSE子句&#xff0c…

【Docker】快速入门之Docker的安装及使用

一、引言 1、什么是Docker Docker是一个开源的应用容器引擎,它让开发者可以将他们的应用及其依赖打包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之…

1688采购工厂货源对接API

1688现有API列表 item_get 获得1688商品详情item_search 按关键字搜索商品item_search_img 按图搜索1688商品(拍立淘)item_search_suggest 获得搜索词推荐item_fee 获得商品快递费用seller_info 获得店铺详情item_search_shop 获得店铺的所有商品item_p…

解决python画图无法显示中文的问题

python画图遇到的问题: 中文不显示: 解决方法:把字体设置为支持中文的字体,比如黑体 黑体下载链接: 链接:https://pan.baidu.com/s/1BD7zQEBUfcIs6mC2CPYy6A?pwdv120 提取码:v120 pyhon…

SpringBoot默认配置文件

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容:SpringBoot默认配置文件 📚个人知识库: Leo知识库,欢迎大家访问 1.前言☕…

Git 基础指令

Git 基础指令 本章涵盖了我们在使用 Git 完成各种操作时将会用到的各种基本命令。 在学习完本章之后,我们应该能够配置并初始化一个仓库(repository)、开始或停止跟踪(track)文件、暂存(stage)…

教你如何打造自己的知识付费平台!

明理信息科技知识付费saas租户平台 一、确定目标群体 首先,你需要明确你的知识付费平台的目标用户是谁。这将帮助你确定所需的内容和功能,以及如何吸引和留住这些用户。例如,如果你的目标群体是职场新人,你的平台可能需要提供职…

如何编写和管理自动化测试用例

开始本篇文章之前,先来介绍下什么是自动化测试用例,即通过编写脚本程序来模拟用户操作和功能验证,并由机器自动执行无人值守的测试用例。 相比手工测试用例,自动化测试用例更快、更准确、更可靠、容易重复执行,且每次…

【python】python新年烟花代码【附源码】

欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 新年的钟声即将敲响,为了庆祝这个喜庆的时刻,我们可以用 Python 编写一个炫彩夺目的烟花盛典。本文将详细介绍如何使用 Pygame 库创建一个令人惊叹的烟花效果。 一、效果图: 二…

植物大战僵尸-C语言搭建童年游戏(easyx)

游戏索引 游戏名称&#xff1a;植物大战僵尸 游戏介绍&#xff1a; 本游戏是在B站博主<程序员Rock>的视频指导下完成 想学的更详细的小伙伴可以移步到<程序员Rock>视频 语言项目&#xff1a;完整版植物大战僵尸&#xff01;可能是B站最好的植物大战僵尸教程了&…

程序员有哪些接单的渠道?

这题我会&#xff01;程序员接单的渠道那可太多了&#xff0c;想要接到合适的单子&#xff0c;筛选一个合适的平台很重要。如果你也在寻找一个合适的接单渠道&#xff0c;可以参考以下这些方向。 首先&#xff0c;程序员要对接单有一个基本的概念&#xff1a;接单渠道可以先粗略…