见原文,仅仅摘录部分:https://www.elastic.co/guide/cn/elasticsearch/guide/current/_preventing_combinatorial_explosions.html

。。。

图 42. Build full depth tree

用真实点的数据,设想平均每部影片有 10 名演员,每部影片就会生成 102 == 100 个桶。如果总共有 20,000 部影片,粗率计算就会生成 2,000,000 个桶。

现在,记住,聚合只是简单的希望得到前十位演员和与他们联合出演者,总共 50 条数据。为了得到最终的结果,我们创建了一个有 2,000,000 桶的树,然后对其排序,取 top10。 图 图 43 “Sort tree” 和图 图 44 “Prune tree” 对这个过程进行了阐述。

图 43. Sort tree

图 44. Prune tree

这时我们一定非常抓狂,在 2 万条数据下执行任何聚合查询都是毫无压力的。如果我们有 2 亿文档,想要得到前 100 位演员以及与他们合作最多的 20 位演员,作为查询的最终结果会出现什么情况呢?

可以推测聚合出来的分组数非常大,会使这种策略难以维持。世界上并不存在足够的内存来支持这种不受控制的聚合查询。

深度优先与广度优先(Depth-First Versus Breadth-First)

Elasticsearch 允许我们改变聚合的 集合模式 ,就是为了应对这种状况。 我们之前展示的策略叫做 深度优先 ,它是默认设置, 先构建完整的树,然后修剪无用节点。 深度优先 的方式对于大多数聚合都能正常工作,但对于如我们演员和联合演员这样例子的情形就不太适用。

为了应对这些特殊的应用场景,我们应该使用另一种集合策略叫做 广度优先 。这种策略的工作方式有些不同,它先执行第一层聚合,  继续下一层聚合之前会先做修剪。 图 图 45 “Build first level” 和图 图 47 “Prune first level” 对这个过程进行了阐述。

在我们的示例中, actors 聚合会首先执行,在这个时候,我们的树只有一层,但我们已经知道了前 10 位的演员!这就没有必要保留其他的演员信息,因为它们无论如何都不会出现在前十位中。

图 45. Build first level

图 46. Sort first level

图 47. Prune first level

因为我们已经知道了前十名演员,我们可以安全的修剪其他节点。修剪后,下一层是基于 它的 执行模式读入的,重复执行这个过程直到聚合完成,如图 图 48 “Populate full depth for remaining nodes” 所示。 这种场景下,广度优先可以大幅度节省内存。

图 48. Populate full depth for remaining nodes

要使用广度优先,只需简单 的通过参数 collect 开启:

{"aggs" : {"actors" : {"terms" : {"field" :        "actors","size" :         10,"collect_mode" : "breadth_first" 

      },。。。}}
}

广度优先仅仅适用于每个组的聚合数量远远小于当前总组数的情况下,因为广度优先会在内存中缓存裁剪后的仅仅需要缓存的每个组的所有数据,以便于它的子聚合分组查询可以复用上级聚合的数据。

广度优先的内存使用情况与裁剪后的缓存分组数据量是成线性的。对于很多聚合来说,每个桶内的文档数量是相当大的。 想象一种按月分组的直方图,总组数肯定是固定的,因为每年只有12个月,这个时候每个月下的数据量可能非常大。这使广度优先不是一个好的选择,这也是为什么深度优先作为默认策略的原因。

针对上面演员的例子,如果数据量越大,那么默认的使用深度优先的聚合模式生成的总分组数就会非常多,但是预估二级的聚合字段分组后的数据量相比总的分组数会小很多所以这种情况下使用广度优先的模式能大大节省内存,从而通过优化聚合模式来大大提高了在某些特定场景下聚合查询的成功率。

转载于:https://www.cnblogs.com/bonelee/p/7832738.html

ES聚合底层机制-bucket深的话采用广度优先更好,而如果是年度统计还是深度优先好...相关推荐

  1. ES聚合查询详解(四):管道聚合

    前言 前面已经介绍了指标聚合和桶聚合的使用,本文继续介绍管道聚合. 一.简介 管道聚合 Pipeline aggregations 官方文档:Pipeline Aggregations 管道聚合主要用 ...

  2. ES聚合查询详解(二):桶聚合

    前言 前面介绍了ES的简单使用,并说明了ES聚合查询主要分为3类:指标聚合.桶聚合和管道聚合. 本文主要是介绍其中桶聚合的相关使用. 一.桶聚合 Bucket 聚合不像Metric聚合那样计算字段上的 ...

  3. ES聚合查询详解(三):指标聚合

    前言 ES聚合查询主要分为3类:指标聚合.桶聚合和管道聚合. 本文主要是介绍其中指标聚合的相关使用. 一.简介 指标聚合 Metrics Aggregations 如果说桶聚合主要是用来做分组的,那么 ...

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

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

  5. tensorflow入门教程和底层机制简单解说——本质就是图计算,自动寻找依赖,想想spark机制就明白了...

    简介 本章的目的是让你了解和运行 TensorFlow! 在开始之前, 让我们先看一段使用 Python API 撰写的 TensorFlow 示例代码, 让你对将要学习的内容有初步的印象. 这段很短 ...

  6. java 对象压缩_理解Java对象:要从内存布局及底层机制说起,话说....

    前言 大家好,又见面了,今天是JVM专题的第二篇文章,在上一篇文章中我们说了Java的类和对象在JVM中的存储方式,并使用HSDB进行佐证,没有看过上一篇文章的小伙伴可以点这里:< 这篇文章主要 ...

  7. 资深架构师推荐Spring技术内幕:深入了解Spring的底层机制

    程序员都很崇拜技术大神,很大一部分是因为他们发现和解决问题的能力,特别是线上出现紧急问题时,总是能够快速定位和解决. 一方面,他们有深厚的技术基础,对应用的技术知其所以然,另一方面,在采坑的过程中不断 ...

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

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

  9. 130.ElasticSearch(五):es聚合查询,nested数组

    目录 一.聚合索引 1.bucket和metric概念 2.操作案例 二.nested object 1.问题 2.原因 3.案例

最新文章

  1. 数据库设计三大范式和ER模型
  2. 论坛报名 | NLP 是否到了产业应用的黄金时代?
  3. Mac下png转icns图标脚本
  4. 第十七届“科大讯飞杯”高校网络友谊赛——F-排列计算
  5. 半小时掌握 Jupyter Notebook常用用法
  6. git命令行删除远程文件
  7. 到底谁才是苹果公司实际控制人?
  8. 51nod 1534 棋子游戏 博弈
  9. java 数独游戏_java数独游戏完整版分享
  10. 数码相机SD卡无法读取怎么办?照片怎么恢复
  11. 《自然语言处理-基于预训练模型的方法》笔记
  12. Android 双卡双待
  13. 老绅士+1,白嫖Wallpaper Engine创意工坊壁纸
  14. DirectX11 板条箱示例Demo
  15. 【Unity VR开发】结合VRTK4.0:瞬移点
  16. k8s实践6:从解决报错开始入门RBAC
  17. Android中AlarmManager的使用
  18. MEF编程-最为简单的Export/Import
  19. evpp mingw64编译过程
  20. 百度前端技术学院-斌斌学院-任务五

热门文章

  1. linux命令行之find详解
  2. Android11模拟定位开发,Android 11 中的位置信息更新
  3. 七牛云 直播 java_七牛云直播SDK之推流解析
  4. php mysql商品管理_PHP基础示例:商品信息管理系统v1.1[转]
  5. 由laravel 5.5无法获取url中的参数引发的apache的.htaccess文件问题
  6. 【408预推免复习】操作系统引论
  7. python【蓝桥杯vip练习题库】ADV-297快速排序
  8. Python程序设计题解【蓝桥杯官网题库】 DAY8-基础练习
  9. vue-loader 源码分析
  10. 简述网卡的作用和工作原理_凯狄简述抽芯铆钉的作用原理