前言
ES聚合查询主要分为3类:指标聚合、桶聚合和管道聚合。
本文主要是介绍其中指标聚合的相关使用。
一、简介
指标聚合 Metrics Aggregations
如果说桶聚合主要是用来做分组的,那么指标聚合就主要是用来做数据计算的。
桶聚合和指标聚合一般都会配合使用。
类似SQL:统计订单表中每个用户的总订单金额。
select sum(t.money) from order t group by t.user
对应的DSL:
POST /order/_search { "size":0, "aggs" : { "group_user" : { "terms" : { "size": 5, "field" : "user", "order": { "sum_money" : "desc" } }, "aggs": { "sum_money": { "sum": {"field": "money"} } } } } }}
说明:
先采用名称为group_user的桶聚合实现根据user进行分组,然后通过子聚合sum_money对各个分组中的money进行求和。
通过order指定根据指标聚合sum_money的计算结果进行倒序排序。
通过aggs中的size限制只统计总订单金额排名前5的数据。
二、常见的指标聚合函数
三、典型使用
1.求平均值 avg
POST /exams/_search?size=0 { "aggs": { "avg_grade": { "avg": { "field": "grade" } } } }
使用脚本script:
通过script在查询时提取出运行时字段grade.corrected
POST /exams/_search?size=0 { "runtime_mappings": { "grade.corrected": { "type": "double", "script": { "source": "emit(Math.min(100, doc['grade'].value * params.correction))", "params": { "correction": 1.2 } } } }, "aggs": { "avg_corrected_grade": { "avg": { "field": "grade.corrected" } } } }
2.最大值计算 max
POST /sales/_search?size=0 { "aggs": { "max_price": { "max": { "field": "price" } } } }
3.最大值计算 min
POST /sales/_search?size=0 { "aggs": { "min_price": { "min": { "field": "price" } } } }
4.求和 sum
POST /sales/_search?size=0 { "query": { "constant_score": { "filter": { "match": { "type": "hat" } } } }, "aggs": { "hat_prices": { "sum": { "field": "price" } } } }
5.速率指标聚合 Rate
速率指标聚合只能在date_histogram 或 composite聚合中使用。它计算每个存储桶中的文档或字段的速率。字段值可以从文档中的特定数值或直方图字段中提取。
GET sales/_search { "size": 0, "aggs": { "by_date": { "date_histogram": { "field": "date", "calendar_interval": "month" }, "aggs": { "my_rate": { "rate": { "unit": "year" } } } } } }
6.唯一值数量统计 value_count
计算从聚合文档中提取的值数量的单值度量聚合。这些值可以从文档中的特定字段中提取,也可以由提供的脚本生成。通常,此聚合器将与其他单值聚合结合使用。
POST /sales/_search?size=0 { "aggs" : { "types_count" : { "value_count" : { "field" : "type" } } } }
返回:
{ ... "aggregations": { "types_count": { "value": 7 } } }
总结
本文主要介绍了ES中指标聚合函数的使用。
桶聚合主要是用来做分组的,那么指标聚合就主要是用来做数据计算的。
桶聚合和指标聚合一般都会配合使用。