elastic聚合总结

在Elasticsearch中,aggs(Aggregation)是一个非常强大的功能,它允许你对查询结果进行多种类型的聚合分析。结合cardinality聚合,可以用于计算某个字段的不同值的数量。

cardinality聚合是用于计算某个字段唯一值的近似数量。在大规模数据集上,cardinality提供比terms聚合更高效的结果,尤其是在字段中有大量不同值的情况下。

语法示例:使用cardinalityaggs结合

假设我们有一个索引存储用户数据,每个文档表示一个用户,字段包括user_idage。如果我们想要计算每个年龄段(例如按年龄分组)内的唯一用户数,可以这样写:

 

json

复制代码

{ "aggs": { "age_groups": { "terms": { "field": "age", "size": 10 }, "aggs": { "unique_users_count": { "cardinality": { "field": "user_id" } } } } } }

解析:

  1. age_groups: 这是一个terms聚合,用于根据age字段对文档进行分组,并列出前10个最常见的年龄(size: 10)。
  2. unique_users_count: 在每个age_groups内,我们做了一个嵌套聚合cardinality,用于计算每个年龄组内user_id字段的唯一值数量,即用户的去重数。

注意事项:

  • cardinality是一个近似算法,它使用HyperLogLog算法来估算唯一值的数量,适用于大数据集,可以提供较低的内存开销。虽然结果是近似的,但通常非常准确。
  • 如果字段数据量较小且需要完全准确的计数,可能需要使用terms聚合配合bucket_sort来实现,但代价较高。

示例输出:

假设查询的结果是这样的:

 

json

复制代码

{ "aggregations": { "age_groups": { "buckets": [ { "key": 25, "doc_count": 150, "unique_users_count": { "value": 120 } }, { "key": 30, "doc_count": 200, "unique_users_count": { "value": 180 } } ] } } }

这里:

  • key: 表示每个年龄段(如25、30)。
  • doc_count: 表示该年龄段内的文档数。
  • unique_users_count.value: 表示该年龄段内不同user_id的数量。

这种组合可以帮助我们在数据量庞大的情况下高效计算分组后的唯一计数。

4o

您说:

elastic里aggs有哪几种聚合,请分别举例子

ChatGPT 说:

ChatGPT

在Elasticsearch中,aggs(聚合)功能非常强大,提供了多种不同类型的聚合操作来帮助我们分析数据。常见的聚合类型包括:

1. Bucket Aggregations(桶聚合)

桶聚合通过将文档分组到不同的桶(buckets)中来执行聚合,类似于SQL中的GROUP BY。常见的桶聚合有:

  • terms:基于字段的值将文档分组。
  • range:将数值、日期等字段按指定的范围进行分组。
  • date_histogram:按时间字段进行分桶,按指定的时间间隔(如小时、天等)。
  • histogram:按数值范围分桶,指定一个步长进行分组。
示例:terms 聚合

category字段将文档分为不同的桶,获取每个类别的文档数量。

 

json

复制代码

{ "aggs": { "category_count": { "terms": { "field": "category", "size": 5 } } } }

示例:range 聚合

根据price字段将文档分为不同价格区间的桶。

 

json

复制代码

{ "aggs": { "price_range": { "range": { "field": "price", "ranges": [ { "to": 50 }, { "from": 50, "to": 100 }, { "from": 100 } ] } } } }

示例:date_histogram 聚合

按日期将文档分为按月的桶。

 

json

复制代码

{ "aggs": { "sales_over_time": { "date_histogram": { "field": "sale_date", "calendar_interval": "month" } } } }

示例:histogram 聚合

price字段的区间(例如每10单位)进行分桶。

 

json

复制代码

{ "aggs": { "price_histogram": { "histogram": { "field": "price", "interval": 10 } } } }


2. Metric Aggregations(度量聚合)

度量聚合用于计算数值型字段的各种统计信息(如总和、平均值等)。

  • avg:计算字段的平均值。
  • sum:计算字段的总和。
  • min:计算字段的最小值。
  • max:计算字段的最大值。
  • count:计算符合条件的文档数。
  • cardinality:计算字段的不同值的数量(近似值)。
示例:avg 聚合

计算price字段的平均值。

 

json

复制代码

{ "aggs": { "average_price": { "avg": { "field": "price" } } } }

示例:sum 聚合

计算total_sales字段的总和。

 

json

复制代码

{ "aggs": { "total_sales": { "sum": { "field": "total_sales" } } } }

示例:minmax 聚合

计算price字段的最小值和最大值。

 

json

复制代码

{ "aggs": { "price_stats": { "stats": { "field": "price" } } } }

示例:cardinality 聚合

计算user_id字段的唯一值数量。

 

json

复制代码

{ "aggs": { "unique_users": { "cardinality": { "field": "user_id" } } } }


3. Pipeline Aggregations(管道聚合)

管道聚合的作用是基于已经计算的聚合结果进行二次聚合,通常用于基于其他聚合结果进行计算或分析。例如,计算聚合结果的排序、平均值、累加等。

  • avg_bucket:计算一个桶聚合结果中的平均值。
  • sum_bucket:计算桶聚合结果的总和。
  • min_bucketmax_bucket:计算桶聚合结果的最小值和最大值。
  • derivative:计算相邻桶之间的差值(例如时间序列数据的变化)。
  • cumulative_sum:计算累积总和。
示例:avg_bucket 聚合

计算每个category_count桶内price的平均值。

 

json

复制代码

{ "aggs": { "category_count": { "terms": { "field": "category", "size": 5 }, "aggs": { "avg_price": { "avg": { "field": "price" } }, "avg_price_bucket": { "avg_bucket": { "buckets_path": "category_count>avg_price" } } } } } }

示例:derivative 聚合

计算时间序列数据中相邻日期之间的销售变化量。

 

json

复制代码

{ "aggs": { "sales_over_time": { "date_histogram": { "field": "sale_date", "calendar_interval": "day" }, "aggs": { "daily_sales": { "sum": { "field": "total_sales" } }, "sales_derivative": { "derivative": { "buckets_path": "daily_sales" } } } } } }


4. Matrix Aggregations(矩阵聚合)

矩阵聚合是用于计算多个字段之间的关系或统计信息,常用于进行交叉相关性分析。

  • matrix_stats:计算多个数值字段的统计信息,包括最小值、最大值、平均值、标准差等。
示例:matrix_stats 聚合

计算pricediscount字段的统计信息。

 

json

复制代码

{ "aggs": { "matrix_stats": { "matrix_stats": { "fields": ["price", "discount"] } } } }


5. Global Aggregation(全局聚合)

全局聚合会计算所有文档的聚合结果,而不管查询的条件是什么。

示例:global 聚合

计算所有文档的price字段的平均值,而不考虑查询的其他条件。

 

json

复制代码

{ "aggs": { "global_avg_price": { "global": {}, "aggs": { "avg_price": { "avg": { "field": "price" } } } } } }


6. Nested Aggregations(嵌套聚合)

嵌套聚合用于嵌套文档或嵌套字段的聚合,通常在使用嵌套类型(nested)时使用。

示例:nested 聚合

聚合嵌套文档中的字段。

 

json

复制代码

{ "aggs": { "nested_reviews": { "nested": { "path": "reviews" }, "aggs": { "average_rating": { "avg": { "field": "reviews.rating" } } } } } }


这些聚合类型可以组合使用,形成更复杂的聚合查询,以满足不同的数据分析需求。在实际使用中,可以根据业务需求选择合适的聚合类型,以获得高效的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值