`
qindongliang1922
  • 浏览: 2189295 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117683
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:126082
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:60037
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71411
社区版块
存档分类
最新评论

关于Elasticsearch里面聚合group的坑

    博客分类:
  • ELK
阅读更多
原来知道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系统里面都会存在这种问题,所以我们应该尽量在设计业务时就考虑到这种特殊情况,然后最终做特殊处理。


有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 技术债不能欠,健康债更不能欠, 求道之路,与君同行。

0
1
分享到:
评论

相关推荐

    elasticsearch聚合值过滤

    而“elasticsearch聚合值过滤”是ES聚合功能的一个高级应用场景,它允许我们根据聚合计算出的结果来进一步筛选文档,即在聚合后的基础上进行过滤操作。这一特性在数据分析和报表生成时非常有用,能够帮助我们得到更...

    elasticsearch脚本实现先聚合后过滤

    在 Elasticsearch (ES) 中,聚合(Aggregations)是一种强大的功能,允许我们对索引中的数据进行统计分析,如求平均值、计数、分桶等。而在某些场景下,我们可能需要在聚合的基础上进一步过滤结果,即基于聚合的结果...

    java使用elasticsearch分组进行聚合查询过程解析

    Java 使用 Elasticsearch 进行分组聚合查询过程解析 Java 使用 Elasticsearch 进行分组聚合查询是一个常见的需求,特别是在大数据处理和数据分析领域。Elasticsearch 提供了强大的聚合功能,可以对数据进行分组、...

    elasticsearch数据库

    Elasticsearch(简称ES)是一种基于Lucene的开源搜索引擎,它在全文搜索、分析和实时数据存储方面具有出色性能。作为NoSQL数据库的一种,Elasticsearch设计之初的目标就是实现分布式、可扩展且具有高可用性的搜索...

    Elasticsearch 聚合分析深入学习

    类似于关系型数据库中的 SUM,AVG, GROUP BY 等,Elasticsearch 也提供了丰富的聚合运算方式,可以满足大部分分析和查询场景。 Doc Values 和 Field Data 在学习聚合分析之前,我们先了解一下 Doc Values 和 Field ...

    elasticsearch-sql-6.2.2.0.zip

    Elasticsearch SQL是Elasticsearch的一个重要扩展,它允许用户使用SQL查询语句来操作Elasticsearch中的数据,极大地降低了Elasticsearch的使用门槛,尤其是对于熟悉SQL语法的开发人员和分析师来说。这个"elastic...

    elasticsearch-sql-master.zip

    2. **聚合查询**:Elasticsearch-SQL支持各种聚合函数,如COUNT、SUM、AVG、MIN、MAX等,以及更复杂的聚合操作,如Terms Aggregation、Histogram Aggregation等。 3. **过滤和排序**:通过WHERE子句,用户可以设置...

    elasticsearch-sql-2.4.5.0.zip

    Elasticsearch SQL插件是为Elasticsearch设计的一款强大的工具,它使得用户能够通过SQL(结构化查询语言)来查询、分析存储在Elasticsearch索引中的数据。这个插件的版本是2.4.5.0,它提供了一种熟悉的方式来访问...

    elasticsearch-6.3.2.zip

    3. GROUP BY与聚合:允许按字段分组并进行聚合计算,如`GROUP BY field_name`或`COUNT(*)`。 4. ORDER BY:可以对结果进行排序,如`ORDER BY field_name ASC/DESC`。 5. JOIN操作:虽然不支持标准的JOIN,但可以使用...

    elasticsearch-sql-2.2.0.1.zip

    Elasticsearch-SQL是针对Elasticsearch的一款社区开发插件,它的主要功能是将传统的SQL查询语句引入到Elasticsearch之中,使得用户能够通过熟悉的SQL语法来操作和查询Elasticsearch索引中的数据,极大地降低了非编程...

    elasticsearch数据的查询sql

    - GROUP BY 和聚合: Elasticsearch SQL 支持 GROUP BY 语句,配合聚合函数(如 COUNT, SUM, AVG, MIN, MAX)进行分组统计,例如 `GROUP BY field1, field2`。 - JOIN: 虽然 Elasticsearch 原生不支持JOIN操作,但...

    elasticsearch-sql-6.2.4.0.zip

    Elasticsearch SQL插件支持多种SQL标准,包括SELECT、FROM、WHERE、GROUP BY、ORDER BY等子句,使得用户可以直接使用SQL查询语句来检索和聚合数据。例如,你可以像在传统数据库中一样,通过指定字段、条件和排序方式...

    Elasticsearch的sql插件.zip

    SQL插件允许开发者和分析师在Elasticsearch中执行SQL查询,这包括了SELECT、WHERE、GROUP BY、ORDER BY等标准SQL语句。它不仅提供了与传统关系型数据库相似的查询方式,还支持聚合操作,使数据分析更为便捷。例如,...

    elasticsearch-6.3.0.tar.gz

    4. **权限**:由于安全考虑,确保Elasticsearch运行用户有正确的权限,可以使用`chown`命令改变文件所有权,如`chown -R user:group .`,将所有文件属主改为特定用户和组。 5. **启动**:运行`bin/elasticsearch`...

    elasticsearch-sql插件

    Elasticsearch-SQL插件是针对Elasticsearch(ES)设计的一个重要工具,它使得用户能够使用SQL(结构化查询语言)来查询、管理和操作Elasticsearch中的数据。SQL是传统数据库系统中广泛使用的查询语言,它的引入为...

    一个关于上传elasticsearch数据库下载、配置、使用入门

    ### Elasticsearch 数据库上传、配置与使用入门 #### 一、Elasticsearch 概述 Elasticsearch 是一款基于 Lucene 的高性能搜索引擎,它不仅提供了强大的全文检索能力,还支持分布式和多租户特性,适用于大规模的...

    Java_使用SQL查询Elasticsearch.zip

    在现代大数据处理中,Elasticsearch(ES)已经成为一种广泛使用的搜索引擎和数据分析工具,而Java作为后端开发的主流语言,自然需要与ES进行紧密集成。"Java_使用SQL查询Elasticsearch.zip"这个压缩包内容可能包含了...

    elasticsearch-javascript-api 离线文档

    Elasticsearch 提供丰富的分析(analyzer)和聚合(aggregations)功能。例如,你可以创建一个按字段分组的聚合: ```javascript client.search({ index: 'my_index', body: { aggs: { group_by_category: { ...

    lasticsearch-SQL使用SQL查询Elasticsearch

    Elasticsearch-SQL是针对Elasticsearch开发的一个插件,它允许用户通过SQL语句来查询Elasticsearch中的数据,极大地降低了使用Elasticsearch的门槛,特别是对于熟悉SQL语法的开发者来说,这是一个非常友好的特性。...

    Elasticsearch快速入门:基础配置与使用示例

    ### Elasticsearch快速入门:基础配置与使用示例 #### Elasticsearch 简介 Elasticsearch 是一个基于 Apache Lucene 的开源搜索引擎。它具有分布式、实时搜索和分析能力,并且支持高可用性和容错性。Elasticsearch...

Global site tag (gtag.js) - Google Analytics