ES的group by功能

本文深入探讨了Elasticsearch中GroupBy的使用方法,包括按字段值进行分组和范围分组,对比了不同聚合构造方式及结果获取的区别,为开发者提供了实用的ES查询技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

group by 按字段的值进行分组

  1. 类似MySQL中的 SELECT sum(field) as sum_field from table group by field order by sum_field desc
  2. es中会使用:AggregationBuilders.sum(“name”).field(“field”); 注意:字段类型必须是数值类型

group by 按字段的值进行范围分组

  1. 参考:Elasticsearch过滤与聚合的先后顺序java实现
  2. 与IEsGroupBySearch接口中groupByFiledValue区别在于:aggregation 构造方式不同;searchResponse获取返回结果方式不同

代码github地址:es查询接口包

### ElasticSearch 中实现按企业分组功能 在 ElasticSearch 中,虽然它不像传统的关系型数据库那样提供直接的 `GROUP BY` 功能,但它通过聚合(Aggregation)机制实现了类似的分组操作。具体来说,可以使用 `terms aggregation` 来完成基于某个字段的分组统计。 以下是详细的说明: #### 使用 Terms Aggregation 实现分组 ElasticSearch 的 `terms aggregation` 可以用来对文档中的某一字段进行分组并计算每组的数量。如果要按照企业的名称(假设字段名为 `enterprise_name`)来分组,则可以通过以下方式构建查询请求[^1]: ```json { "size": 0, "aggs": { "group_by_enterprise": { "terms": { "field": "enterprise_name.keyword", "size": 100 } } } } ``` - **`size`:** 设置为 `0` 表示不返回具体的匹配文档列表,仅关注聚合结果。 - **`aggs`:** 定义了一个名为 `group_by_enterprise` 的聚合,用于对企业名称字段进行分组。 - **`terms`:** 指定分组依据的字段名,在这里是 `enterprise_name.keyword`。注意,对于字符串类型的字段,默认会经过分析器处理,因此通常需要指定 `.keyword` 后缀以便精确匹配[^1]。 - **`size`:** 控制返回的最大分组数量,这里设置为 `100`,可以根据实际需求调整。 执行此查询后,响应体中将包含每个企业的唯一值及其对应的文档计数。 #### 结果解释 假设索引中有如下几条记录: | _id | enterprise_name | |-----|----------------| | 1 | Google | | 2 | Microsoft | | 3 | Google | 则上述查询的结果可能类似于这样: ```json { "aggregations": { "group_by_enterprise": { "buckets": [ { "key": "Google", "doc_count": 2 }, { "key": "Microsoft", "doc_count": 1 } ] } } } ``` 其中,`buckets` 列表展示了各个企业的名字以及它们所关联的文档数目。 #### 进一步扩展:子聚合与指标计算 除了简单的分组外,还可以嵌套其他类型的聚合来进行更复杂的分析。例如,可以在每个企业内部进一步统计平均评分或其他数值属性。下面是一个例子,展示如何在一个企业内计算某项分数的平均值: ```json { "size": 0, "aggs": { "group_by_enterprise": { "terms": { "field": "enterprise_name.keyword" }, "aggs": { "average_score": { "avg": { "field": "score" } } } } } } ``` 这段代码不仅完成了按企业分组的操作,还针对每个企业内的所有文档计算了其 `score` 字段的均值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值