本文为 ES聚合算法原理深入解读:深度优先算法(DFS)和广度优先算法(BFS)第一篇

深度优先算法(DFS)和广度优先算法(BFS):DFS 和 BFS 在 ES 中的应用(一)
深度优先算法(DFS)和广度优先算法(BFS):深度优先搜索算法(二)
深度优先算法(DFS)和广度优先算法(BFS):广度优先搜索算法(三)

文章目录

  • 1、引言
  • 2、案例
    • 2.1 数据
    • 2.2 假设有如下需求:
    • 2.3 性能痛点
  • 3 解决方式
    • 3.1 Collect mode
    • 3.2 参数
    • 3.3 完整代码如下

1、引言

Elasticsearch中的 Terms 桶聚合基于我们的数据动态构建桶;但是它并不知道到底生成了多少桶。 大多数时候对单个字段的聚合查询还是非常快的, 但是当需要同时聚合多个字段时,就可能会产生大量的分组,最终结果就是占用 es 大量内存,从而导致 OOM 的情况发生。

在Elasticsearch中,对于具有许多唯一术语和少量所需结果的字段,延迟子聚合的计算直到顶部父级聚合被修剪会更有效。通常,聚合树的所有分支都在一次深度优先传递中展开,然后才会发生任何修剪。在某些情况下,非常浪费资源,并且可能会遇到内存限制。

而本文所讲的内容即通过 DFS 和 BFS 提升检索效率和提升聚合性能,基本原理即:推迟子聚合的计算。

2、案例

假设有索引actor_films,存储信息为某些演员和其出演过的一些电影。

2.1 数据

PUT /actor_films/_doc/1
{"name": "成龙","films": [{"name": "A计划","collect": 210},{"name": "B计划","collect": 200},{"name": "C计划","collect": 230},{"name": "D计划","collect": 250}]
}
PUT /actor_films/_doc/2
{"name": "李连杰","films": [{"name": "功夫","collect": 310},{"name": "少林寺","collect": 400},{"name": "峨眉","collect": 530}]
}
PUT /actor_films/_doc/3
{"name": "吴京","films": [{"name": "战狼","collect": 210},{"name": "战狼2","collect": 500},{"name": "流浪地球","collect": 630}]
}

2.2 假设有如下需求:

统计演员列表中总票房最高的前十位演员每个人票房最高的前五部电影

因为无法导入大量数据,并且聚合代码本身非本文所讲解重点,因此下面代码采用伪代码方式,即跳过具体的逻辑部分。

伪代码如下:

GET actor_films/_search
{"size": 0,"aggs": {"actors_agg": {"terms": {"field": "name.keyword","size": 10 // 这里跳过了计算过程,假设默认排序就是票房排序倒序排列},"aggs": {"movies_agg": {"terms": {"field": "movies.name.keyword","size": 5 // 假设默认就是票房排序}}}}}
}

2.3 性能痛点

首先,上述代码描述的问题可用下图表示,假设演员数据有M个,M是一个很大的数值,比如1万、10万或者更多。每位演员出演过N部电影,每个M对应的N可能不同,N 大于5。

按照上述需求,我们最终要返回的桶数量最大值为 50。默认情况下,ES 会先构建完整的树,然后修剪无用节点。下图中表示即先遍历 演员1,然后遍历演员一的第一个分支,直至第一个分支没有子节点,回溯值演员一的第二个分支,直至遍历完演员1 的所有分支,回溯至Entry,然后遍历演员2。最终遍历节点数为 MN。如果演员数量有1万,平均每个演员10部电影,此时遍历所产生的的计算为10万次,而我们真正需要的只有50次!

3 解决方式

3.1 Collect mode

ES 中允许设置参数collect_mode

"collect_mode": "{collect_mode.value}"

3.2 参数

  • breadth_first:即使用广度优先算法。即:先做第一层聚合,逐层修剪。广度优先仅仅适用于每个组的聚合数量远远小于当前总组数的情况下,因为广度优先会在内存中缓存裁剪后的仅仅需要缓存的每个组的所有数据,以便于它的子聚合分组查询可以复用上级聚合的数据。广度优先的内存使用情况与裁剪后的缓存分组数据量是成线性的。对于很多聚合来说,每个桶内的文档数量是相当大的。

  • depth_first:使用深度优先算法,即:先构建完整的树,然后修剪无用节点。

3.3 完整代码如下

GET actor_films/_search
{"size": 0,"aggs": {"actors_agg": {"terms": {"field": "name.keyword","size": 10, // 这里跳过了计算过程,假设默认排序就是票房排序倒序排列"collect_mode": "breadth_first" // 使用广度优先搜索},"aggs": {"movies_agg": {"terms": {"field": "movies.name.keyword","size": 5 // 假设默认就是票房排序}}}}}
}

ES聚合算法原理深入解读:深度优先算法(DFS)和广度优先算法(BFS)(一)相关推荐

  1. 数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)

    目录 深度优先遍历(DFS)和广度优先遍历(BFS)原理 1.自己的原理图 2.官方原理图 一.邻接矩阵的深度优先遍历(DFS) 1.原理图 2. 过程: 3.总代码 二.邻接表的深度优先遍历(DFS ...

  2. 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法

    深度优先(DFS) 深度优先遍历,从初始访问结点出发,我们知道初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接 ...

  3. 一文搞定深度优先搜索(DFS)与广度优先搜索(BFS)【含完整源码】

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  4. 【数据结构与算法】2.深度优先搜索DFS、广度优先搜索BFS

    原文链接:https://blog.csdn.net/qq_41681241/article/details/81432634 总结 一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的 ...

  5. 图的遍历(深度优先遍历DFS,广度优先遍历BFS)以及C语言的实现

    遍历的定义: 从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算. 一:深度优先遍历(DFS) 1,在访问图中某一起始顶点V后,由V ...

  6. 【蓝桥杯】2015决赛A组 5 穿越雷区(深度优先搜索dfs、广度优先搜索bfs)

    历届试题 穿越雷区 问题描述 X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废. 某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征), ...

  7. 数据结构-图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析

    https://www.cnblogs.com/qzhc/p/10291430.html 最后一个广度优先有错误,H不指向E,只有G指向E,所以顺序应该是ABCFDHGE

  8. 深度优先搜索(DFS)和广度优先搜索(BFS)探究

    附BFS解题代码: #include<iostream> #include<queue> using namespace std;char room[23][23]; int ...

  9. ES聚合算法原理深入解读:深度优先算法(DFS)和广度优先算法(BFS)(三)

    本文为:ES聚合算法原理深入解读:深度优先算法(DFS)和广度优先算法(BFS)第三篇 深度优先算法(DFS)和广度优先算法(BFS):DFS 和 BFS 在 ES 中的应用(一) 深度优先算法(DF ...

最新文章

  1. 基于 Webpack 3 的 React 工程项目脚手架
  2. 深度学习以及卷积基础
  3. 剑指 Offer 16. 数值的整数次方
  4. PostgreSQL 10.1 手册_部分 III. 服务器管理_第 26 章 高可用、负载均衡和复制_26.4. 日志传送的替代方法...
  5. 【数电】(一) 进制转换编码 原码,反码,补码
  6. python数值运算代码_Python数值
  7. 河北2021高考成绩查询具体时间,2021河北高考时间具体安排表
  8. 批量执行newman
  9. 第十七届振兴杯计算机程序设计员(云计算平台运维与开发)决赛
  10. python数字猜大小游戏
  11. 从招聘网站分析大数据相关职位现状
  12. 计算机管理没有Android手机项,电脑没有手机驱动各品牌解决办法
  13. 数字图像处理Project1——指纹图片的增强
  14. wangeditor富文本编辑器集成配置
  15. 华东理工大学的计算机系,华东理工大学计算机系介绍
  16. LayUI 后台管理模板
  17. matlab用正弦做随机信号程序,(MATLAB辅助现代工程数字信号处理)第6章平稳随机信号处理与分析.ppt...
  18. spark知识点_RDD
  19. Java设计模式七大原则-单一职责原则
  20. c语言中a 的用法,C语言中#define的用法

热门文章

  1. 面向GIS工作者的Excel 坐标格式转换公式
  2. 3.4 Linux系统日志的清除
  3. mysql 求两列时间差
  4. Ubuntu学习系列——添加源
  5. MySQL笔试题整理(二)
  6. 成龙价值2亿私人飞机曝光 成龙秘密培养K-POP组合jjcc欲创娱乐公司?
  7. 论文笔记:Few-Shot Named Entity Recognition: An Empirical Baseline Study
  8. classcastexception异常_Java 最全异常讲解
  9. MERRA-2数据下载详细教程
  10. AssetManager中的路径参数不能包含assets/