参考链接:https://blog.csdn.net/u010454030/article/details/71762838

ES group分组聚合的坑

原来知道Elasticsearch在分组聚合时有一些坑但没有细究,今天又看了遍顺便做个笔记和大家分享一下。

我们都知道Elasticsearch是一个分布式的搜索引擎,每个索引都可以有多个分片,用来将一份大索引的数据切分成多个小的物理索引,解决单个索引数据量过大导致的性能问题,另外每个shard还可以配置多个副本,来保证高可靠以及更好的抗并发的能力。

将一个索引切分成多个shard,大多数时候是没有问题的,但是在es里面如果索引被切分成多个shard,在使用group进行聚合时,可能会出现问题,这个在官网文档里,描述也非常清楚

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html#_shard_size_3

下面就针对官网的例子,描述下,group count如果有多个shard可能会出现的问题

假设我们现在,我们有一份商品的索引数据,它有3个shard,每个shard的数据如下所示:

现在我们的需求是,按商品分组求top5的商品,es收到这个请求后,会去搜索这三个shard,然后子每个shard上面取top5,数据如下图所示:

最后,将三个shard的top5的数据,最后做一下汇聚然后最终排序取top5结果如下图:

最后我们发现这个top5的结果,并不是100%精确的,只是一个近似精确的结果值:

Product A在所有top5的shard数据里面都存在,所以它的结果是精确的, Product C仅仅返回了 shard A 和 C里面的top5的数据,所以这里显示50是不精确的, Product C在shard B里面也存在,但是它在 top5里面没有出现,所以group后的结果实际上是有误差的,再来看下 Product Z仅仅返回了2个shards的数据 因为第三个里面不存在,所以它的结果是准确的,最后我们注意下 Product H实际上它的总数是44,横跨三个shard 但是它在每个shard的top5里面并没有出现,所以最终的top5里面也没有这条数据,这样看来最终的top5的值并不是100% 准确的,这一点在设计和使用es的时候需要特别注意。

虽然我们可以调大返回size的个数来提高精确度,但是size个数的提升,也意味着有更多的数据会被返回,从而会导致检索性能的下降,这一点是需要找到平衡点的。

那么有没有方法避免这种不精确的统计的呢?

答案是有的,es官网文档里面也提到,总共有2种:

第一种:

聚合操作在单个shard时是精确的,也就是说我们索引的数据全部插入到一个shard的时候 它的聚合统计结果是准确的。

第二种:

在索引数据的时候,使用route路由字段,将所有聚合的数据分布到同一个shard即可,这样再聚合时也是精确的。

上面的两种办法都是可以解决的,第一种适合数据量不大的场景下,我们直接把数据放在一份索引里面,第二种办法适合数据量比较大的场景下,我们通过业务字段将相同属性的数据路由在同一个shard里面即可,具体使用哪个需要和具体的业务场景相结合。

总结:

es虽然很强大,但是在一些场景下也是有局限的,比如上面提到的聚合分组的这个情况,或者聚合分组+分页的情况,此外min,max,sum这些函数在多个shard中聚合结果是准确的,count是近似准确的,但是es能保证top 前几的数据是精确的,这也是为什么搜索引擎一般都返回top n数据作为最终的返回结果,当然上面提到那个例子,如果聚合的key本来就很少,那么它的聚合结果也是准确的,比如按性别,月份聚合,因为这些返回的key,都是有限的,所以结果没问题,但是一旦对分组的个数没法确定,这种情况下出现问题的几率就比较大,跨表或者跨分片聚合其实在任何db系统里面都会存在这种问题,所以我们应该尽量在设计业务时就考虑到这种特殊情况,然后最终做特殊处理。

转载于:https://www.cnblogs.com/txfsheng/p/9322141.html

ES group分组聚合的坑相关推荐

  1. SPARK-SQL - group分组聚合api,agg()

    准备orders.json文件 {"id":"1", "userId":"1", "userName" ...

  2. Python数据清洗小技巧——分组聚合

    分组聚合 分组 groupby原理 import numpy as np import pandas as pddf = pd.DataFrame(data = {'sex':np.random.ra ...

  3. R语言dplyr包获取dataframe分组聚合的最大值实战(Maximum Value by Group)

    R语言dplyr包获取dataframe分组聚合的最大值实战(Maximum Value by Group) 目录 R语言dplyr包获取dataframe分组聚合的最大值实战(Maximum Val ...

  4. mysql group by 聚合_浅析MySQL使用 GROUP BY 分组聚合与细分聚合

    1. 聚合函数(Aggregate Function) MySQL(5.7 ) 官方文档中给出的聚合函数列表(图片)如下: 除非另有说明,否则聚合函数都会忽略空值(NULL values). 2. 聚 ...

  5. 【Python数据分析与处理 实训03】 --- 酒类消费信息分析(数据分组聚合 group().agg()应用)

    [Python数据分析与处理 实训03] - 酒类消费信息分析(数据分组聚合 group().agg()应用) 探索酒类消费信息 对于下面的数据集进行简单的一些数据的分析训练 若需要源数据请私信~ 1 ...

  6. php sequelize,Sequelize中用group by进行分组聚合查询

    一.SQL与Sequelize中的分组查询 1.1 SQL中的分组查询 SQL查询中,通GROUP BY语名实现分组查询.GROUP BY子句要和聚合函数配合使用才能完成分组查询,在SELECT查询的 ...

  7. Solr分组聚合查询之Group

    摘要: Solr对结果的分组处理除了facet还可以使用group.Solr的group是根据某一字段对结果分组,将每一组内满足查询的结果按顺序返回. Group对比Facet Group和Facet ...

  8. es对分组后结果进行统计_ElasticSearch里面如何分组后根据sum值排序

    ElasticSearch里面的聚合机制非常灵活和强大,今天我们来看下如何在ElasticSearch里面实现分组后,根据sum值进行排序?类似的数据库SQL如下: select id,sum(c1) ...

  9. 【原创】StreamInsight查询系列(六)——基本查询操作之分组聚合

    上篇博文介绍了StreamInsight基础查询操作中的用户自定义聚合部分.这篇文章将主要介绍如何在StreamInsight查询中使用分组聚合. 测试数据准备 为了方便测试查询,我们首先准备一个静态 ...

最新文章

  1. NVIDIA Jetson Xavier NX安装torch和torchvision
  2. 对geobeansEvent事件回调函数的改进
  3. Vue.JS项目输入框中使用v-model导致number类型值自动转换成string问题的解决方案
  4. Linux操作系统下实现远程开机
  5. error C1128:字节数超过对象文件格式xxxx.cpp限制:请使用/bigobj进行编译 cmake的解决方式
  6. 微信小程序setData的回调方法
  7. 行业揭秘:A股日内“T+0” 赚钱的方法
  8. python 正则表达式 r_python 正则表达式
  9. Anaconda介绍、安装及使用保姆级教程
  10. 高洛峰招徒培养IT名师
  11. python3保存的npy文件,python2无法读取的可能解决方案。
  12. jenkins+Warnings Next Generation Plugin构建代码自动化检测
  13. 射影几何笔记4:公理和证明
  14. 由浅入深玩转华为WLAN—20 漫游系列(7)不同AC之间二层漫游【二层上线+直连式+直接转发模式】
  15. vb怎样访问网络服务器的access数据库
  16. SpringBoot整合SpringEmail 批量发送邮件
  17. linux 硬连接和软连接
  18. WIN10系统安装Ubuntu子系统并在此基础上安装ncl
  19. Springboot连接Access2003数据库
  20. 7-50 输出华氏-摄氏温度转换表 (15 分)

热门文章

  1. 软件项目报价明细表_BIM必学软件之REVIT
  2. atheros蓝牙设备驱动 小米_小米Air 13笔记本黑苹果WiFi蓝牙硬件改装方案二
  3. C语言 PK 各大编程语言
  4. C 线程的使用~(下)
  5. 8条嵌入式C语言编程小知识总结
  6. java zip解压_Java语言入门第一课
  7. mysql+after+commit_Spring事务aftercommit原理及实践
  8. python程序、画一个笑脸_如何使用canvas画一个微笑的表情(代码示例)
  9. php中des加密cbc模式,php中加密解密DES类的简单使用方法示例
  10. [渝粤教育] 西南科技大学 畜牧概论 在线考试复习资料