当前位置: 首页 > article >正文

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" } } } } } }


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


http://www.kler.cn/a/505933.html

相关文章:

  • Redisson
  • 网络编程 - - TCP套接字通信及编程实现
  • 记一次OpenEuler Linux磁盘分区表损坏的数据恢复
  • 如何禁用 PySpark 在运行时打印信息
  • SpringBoot + Websocket实现系统用户消息通知
  • vue2制作长方形容器,正方形网格散点图,并且等比缩放拖动
  • STM32 HAL库函数入门指南:从原理到实践
  • Flutter使用BorderRadiusTween实现由矩形变成圆形的动画
  • CPU缓存学习
  • 关于Profinet 从站转 EtherNet/IP 从站网关详细说明
  • 3. Flink 窗口
  • Mysql--重点篇--索引(索引分类,Hash和B-tree索引,聚簇和非聚簇索引,回表查询,覆盖索引,索引工作原理,索引失效,索引创建原则等)
  • 计算机网络_重点梳理
  • 双端队列实战 实现滑动窗口 用LinkedList的基类双端队列Deque实现 洛谷[P1886]
  • 金融项目实战 05|Python实现接口自动化——登录接口
  • VMWARE linux LVM 扩容磁盘分区
  • lqb.key按键全套
  • 如果 iPhone 丢失或被盗,如何远程擦除 iPhone?
  • .NET 内存管理释放的两种方式
  • 力扣经典练习题之70.爬楼梯
  • 类型安全与代码复用的C# 泛型
  • Hypium UIViewer 让 MacOS 与鸿蒙NEXT手机实现多屏协同
  • 硬件设计-齐纳管
  • ESXi 切换硬盘直通后无法恢复的解决办法
  • Git文件夹提交错了,怎么撤销?
  • R语言的数据库交互