Elasticsearch的聚合(aggs)操作

Elasticsearch的聚合(aggs)提供了强大的数据统计和分析功能,包括桶(bucket)和度量(metrics)两大类型。桶主要用于数据分组,如Date Histogram、Histogram、Terms和Range Aggregation;度量则用于对分组数据进行计算,如平均值、最大值、最小值等。文章还介绍了各种聚合示例和阶梯分桶Histogram的应用。

目录

聚合(aggregations)

1.桶(bucket)

2.度量(metrics)

3.聚合为桶示例

4.桶内度量示例

5.嵌套桶示例

6.阶梯分桶Histogram

 


 

聚合(aggregations)

 

聚合可以让我们极其方便的实现对数据的统计、分析,实现这些统计功能的比数据库的sql要方便的多,而且查询速度非常快,可以实现实时搜索效果。下面介绍两种最常用的聚合  

 

1.桶(bucket)

桶的作用,是按照某种方式对数据进行分组,但不包括计算,因此bucket中往往会嵌套另一种聚合:metrics aggregations即度量

比较常用的桶划分方式有

  • Date Histogram Aggregation:根据日期阶梯分组,例如给定阶梯为周,会自动每周分为一组

  • Histogram Aggregation:根据数值阶梯分组,与日期类似

  • Terms Aggregation:根据词条内容分组,词条内容完全匹配的为一组

  • Range Aggregation:数值和日期的范围分组,指定开始和结束,然后按段分组

 

<think>我们正在讨论Elasticsearch DSL中的聚合aggs)用法示例。根据用户需求,需要展示聚合语法的示例。结合引用[1]和引用[2]的内容,我们知道聚合用于数据统计和分析,可以按不同维度分组和汇总。 聚合的基本结构: "aggs": { "自定义聚合名称": { "聚合类型": { "field": "字段名" }, "aggs": { ... } // 子聚合(可选) } } 常见聚合类型: - terms: 按字段分组(类似SQL的GROUP BY) - metrics: 计算指标(如sum, avg, max, min, stats等) 根据引用[4]中的示例,我们可以展示一个包含分桶和度量的聚合示例。 下面我将提供几个不同场景的聚合示例: </think> ### Elasticsearch DSL聚合(aggs)用法示例 Elasticsearch聚合功能用于数据分析,支持多种统计计算和分组操作。以下是核心用法示例: --- #### 1. **基础分组统计** 按字段分组并计算文档数量(类似SQL的GROUP BY): ```json { "size": 0, // 不返回原始文档 "aggs": { "group_by_category": { // 自定义聚合名称 "terms": { "field": "category.keyword", // 分组字段 "size": 10 // 返回前10个分组 } } } } ``` 返回结果包含每个类别的文档计数[^2]。 --- #### 2. **嵌套子聚合** 分组后计算每组内的数值统计(如价格平均值): ```json { "aggs": { "group_by_category": { "terms": {"field": "category.keyword"}, "aggs": { // 子聚合 "avg_price": { "avg": {"field": "price"} // 计算均价 }, "max_price": { "max": {"field": "price"} // 计算最高价 } } } } } ``` 结果结构: ```json "buckets": [ { "key": "electronics", "doc_count": 120, "avg_price": {"value": 299.5}, "max_price": {"value": 999} } ] ``` --- #### 3. **多维度聚合** 同时按多个字段分组(类似SQL的多维GROUP BY): ```json { "aggs": { "group_by_category_and_brand": { "composite": { // 复合桶 "sources": [ { "category": {"terms": {"field": "category.keyword"}} }, { "brand": {"terms": {"field": "brand.keyword"}} } ] } } } } ``` --- #### 4. **指标扩展** 使用扩展统计获取更多指标(如标准差、方差): ```json { "aggs": { "price_stats": { "extended_stats": { // 扩展统计 "field": "price" } } } } ``` 返回结果包含: - `count`, `min`, `max`, `avg`, `sum` - `variance`, `std_deviation`(标准差)[^4] --- #### 5. **日期直方图** 按时间区间分组(如每月销售额统计): ```json { "aggs": { "sales_per_month": { "date_histogram": { "field": "order_date", "calendar_interval": "month", // 按月分组 "min_doc_count": 0 // 包含无数据的月份 }, "aggs": { "total_sales": {"sum": {"field": "amount"}} } } } } ``` --- #### 6. **Python DSL示例** 通过Elasticsearch DSL库实现聚合(参考引用[4]): ```python from elasticsearch_dsl import Search, A s = Search(index="products") s.aggs.bucket("per_category", "terms", field="category.keyword") \ .metric("avg_price", "avg", field="price") \ .metric("total_stock", "sum", field="stock") response = s.execute() # 提取结果 for cat in response.aggregations.per_category.buckets: print(f"Category: {cat.key}, Avg Price: {cat.avg_price.value}") ``` > **关键技巧**: > 1. 对`keyword`类型字段使用`terms`聚合,避免文本分词影响 > 2. 结合`size:0`忽略原始文档返回,提升性能 > 3. 使用`min_doc_count`控制空桶是否返回 [^1]: 聚合语法详解 : 分组聚合示例 [^4]: 聚合指标扩展
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值