elastic聚合总结
在Elasticsearch中,aggs
(Aggregation)是一个非常强大的功能,它允许你对查询结果进行多种类型的聚合分析。结合cardinality
聚合,可以用于计算某个字段的不同值的数量。
cardinality
聚合是用于计算某个字段唯一值的近似数量。在大规模数据集上,cardinality
提供比terms
聚合更高效的结果,尤其是在字段中有大量不同值的情况下。
语法示例:使用cardinality
和aggs
结合
假设我们有一个索引存储用户数据,每个文档表示一个用户,字段包括user_id
和age
。如果我们想要计算每个年龄段(例如按年龄分组)内的唯一用户数,可以这样写:
json
复制代码
{ "aggs": { "age_groups": { "terms": { "field": "age", "size": 10 }, "aggs": { "unique_users_count": { "cardinality": { "field": "user_id" } } } } } }
解析:
age_groups
: 这是一个terms
聚合,用于根据age
字段对文档进行分组,并列出前10个最常见的年龄(size: 10
)。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" } } } }
示例:min
和 max
聚合
计算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_bucket 和 max_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
聚合
计算price
和discount
字段的统计信息。
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" } } } } } }
这些聚合类型可以组合使用,形成更复杂的聚合查询,以满足不同的数据分析需求。在实际使用中,可以根据业务需求选择合适的聚合类型,以获得高效的结果。