前言
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中指标聚合函数的使用。
桶聚合主要是用来做分组的,那么指标聚合就主要是用来做数据计算的
。
桶聚合和指标聚合一般都会配合使用。