聚合套路
类似于 DSL 查询表达式,聚合也有可组合的语法:独立单元的功能可以被混合起来提供你需要的自定义行为。这意味着只需要学习很少的基本概念,就可以得到几乎无尽的组合。
先说ES聚合的两个基本概念:桶(Buckets)和指标(Metrics)。
桶(Buckets):满足特定条件的文档的集合。分组的意思,类似SQL中的GROUP BY
指标(Metrics):对桶内的文档进行统计计算。注意理解黄色部分,类似于SQL中的COUNT() 、 SUM() 、 MAX() 等统计方法。
注意记住并理解上面引用文字中标黄的那一段。它就是聚合套路的核心点
开始下面的内容之间,我们先去官网‘借’点数据。
POST /cars/transactions/_bulk
{ "index": {}}
{ "price" : 10000, "color" : "red", "make" : "honda", "sold" : "2014-10-28" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 30000, "color" : "green", "make" : "ford", "sold" : "2014-05-18" }
{ "index": {}}
{ "price" : 15000, "color" : "blue", "make" : "toyota", "sold" : "2014-07-02" }
{ "index": {}}
{ "price" : 12000, "color" : "green", "make" : "toyota", "sold" : "2014-08-19" }
{ "index": {}}
{ "price" : 20000, "color" : "red", "make" : "honda", "sold" : "2014-11-05" }
{ "index": {}}
{ "price" : 80000, "color" : "red", "make" : "bmw", "sold" : "2014-01-01" }
{ "index": {}}
{ "price" : 25000, "color" : "blue", "make" : "ford", "sold" : "2014-02-12" }
terms(分组、group by)
我们先来个最简单的。看下有多少种颜色的汽车。
GET cars/transactions/_search
{
"size": 0,
"aggs": {
"取一个你想要的名字": {
"terms": {
"field": "color.keyword",
"size": 10
}
}
}
}
聚合操作被置于顶层参数 aggs 之下(全称aggregations)
为你的取一个你想要的名字,以便在应用里面解析结果
最外面的size设置成 0,因为我们并不关心搜索结果的具体内容,所以将返回记录数设置为 0 来提高查询速度。
terms里面的size,用来限制统计结果数量。配合order参数,可以很轻松完成TopN的需求
sum(求和)
我们现在需要统计汽车的总销售额。
GET cars/transactions/_search
{
"size": 0,
"aggs": {
"取一个你想要的名字": {
"sum": {
"field": "price"
}
}
}
}
组合聚合
在我们组合在我们使用不同的嵌套方案时,聚合的力量才能真正得以显现。
将度量嵌套于桶内
标题看起来太官方了,翻译过来就是在分组之后统计某些数量。我们现在需要统计每种颜色汽车的销售额,并按销售额降序排列