1. global:就是global bucket,就是将所有数据纳入聚合的scope,而不管之前的query
GET /tvs/sales/_search
{
"size": 0,
"query": {
"term": {
"brand": {
"value": "长虹"
}
}
},
"aggs": {
"single_brand_avg_price": {
"avg": {
"field": "price"
}
},
"all": {
"global": {},
"aggs": {
"all_brand_avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}
- 出来两个结果
- 一个结果,是基于query搜索结果来聚合的,一个聚合操作,必须在query的搜索结果范围内执行
- 一个结果,是对所有数据执行聚合的
2.histogram
histogram桶是将指定字段值在某个范围内的文档聚合在一个桶中,如下图所示,0-19999是一个桶,11000和15000在一个桶内,23000和31000在一个桶内,这就是histogram桶。
GET /cars/transactions/_search
{
"size":0, ---令返回值的hits对象为空
"aggs":{ ---聚合命令
"price":{ ---聚合字段名称
"histogram": { ---桶类型
"field": "price", ---指定price字段的值作为判断条件
"interval": 20000 ---每个桶负责的区间大小为20000
}
}
}
}
结果
{
"took" : 57,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 8,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : { ---聚合结果
"price" : { ---请求参数中指定的名称
"buckets" : [ ---price桶的数据在此数组中
{
"key" : 0.0, ---第一个桶,区间[0-19999],0.0是起始值
"doc_count" : 3 ---这个区间有三个文档(price值分别是10000、12000、15000)
},
{
"key" : 20000.0, ---第二个桶,区间[20000-39999],20000.0是起始值
"doc_count" : 4 ---这个区间有四个文档
},
{
"key" : 40000.0, ---第三个桶,区间[40000-59999],40000.0是起始值
"doc_count" : 0 ---这个区间没有文档
},
......
在上面的返回值中,第三个桶中没有文档,在有的业务场景中,我们不需要没有数据的桶,此时可以用min_doc_count参数来控制,如果min_doc_count等于2,表示桶中最少有两条记录才会出现在返回内容中,如下所示,min_doc_count如果等于1
3.histogram桶加metrics
上面的例子返回结果只有每个桶内的文档数,也可以加入metrics对桶中的数据进行处理,例如计算每个区间内的最高价、最低价、平均售价,可以加入max、min、avg参数,如下:
GET /cars/transactions/_search
{
"size":0, ---令返回值的hits对象为空
"aggs":{ ---聚合命令
"price":{ ---聚合字段名称
"histogram": { ---桶类型
"field": "price", ---指定price字段的值作为判断条件
"interval": 20000 ---每个桶负责的区间大小为20000
},
"aggs": { ---表示对桶内数据做metrics
"max_price": { ---指定metrics处理结果的字段名
"max":{ ---metrics类型为max
"field": "price" ---指定取price字段的值做最大值比较
}
},
"min_price": { ---指定metrics处理结果的字段名
"min":{ ---metrics类型为min
"field": "price" ---指定取price字段的值做最小值比较
}
},
"avg_price": { ---指定metrics处理结果的字段名
"avg":{ ---metrics类型为avg
"field": "price" ---指定取price字段的值计算平均值
}
}
}
}
}
}
es返回数据和说明如下,可见每个桶中的文档都做了三种metrics处理
{
"took" : 17,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 8,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : { ---聚合结果
"price" : { ---请求参数中指定的名称
"buckets" : [ ---price桶的数据在此数组中
{
"key" : 0.0, ---第一个区间[0-19999],0.0是起始值
"doc_count" : 3, ---这个区间有三条记录(price值分别是10000、12000、15000)
"max_price" : { ---指定的metrics结果名称
"value" : 15000.0 ---桶中有三个文档,price字段的最大值是15000
},
"min_price" : {
"value" : 10000.0 ---桶中有三个文档,price字段的最小值是10000
},
"avg_price" : {
"value" : 12333.333333333334 ---桶中有三个文档,price字段的平均值是12333.333333333334
}
},
......
4.时间区间的桶(date_histogram)
GET /cars/transactions/_search
{
"size": 0, ---令返回值的hits对象为空
"aggs": { ---聚合命令
"sales": { ---聚合字段名称
"date_histogram": { ---桶类型
"field": "sold", ---用sold字段的值作进行时间区间判断
"interval": "month", ---间隔单位是月
"format": "yyyy-MM-dd" ---返回的数据中,时间字段格式
,"min_doc_count": 0,---// 为空的话则填充0
"extended_bounds": { ---// 需要填充0的范围
"min": 1533556800000,
"max": 1533806520000
}
————————————————
版权声明:本文为CSDN博主「大白能」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_28988969/article/details/81565765
},
"aggs": { ---表示对桶内数据做metrics
"max_price": { ---指定metrics处理结果的字段名
"max":{ ---metrics类型为max
"field": "price" ---指定取price字段的值做最大值比较
}
},
"min_price": { ---指定metrics处理结果的字段名
"min":{ ---metrics类型为min
"field": "price" ---指定取price字段的值做最小值比较
}
}
}
}
}
}
es返回数据如下,篇幅所限因此略去了头部和尾部的一些信息,只看关键的
"aggregations" : { ---聚合结果
"sales" : { ---请求参数中指定的名称
"buckets" : [ ---sales桶的数据在此数组中
{
"key_as_string" : "2014-01-01", ---请求的format参数指定了key的格式
"key" : 1388534400000, ---真正的时间字段
"doc_count" : 1, ---2014年1月份的文档数量
"max_price" : { ---2014年1月的文档做了metrics类型为max的处理后,结果在此
"value" : 80000.0 ---2014年1月的文档中,price字段的最大值
},
"min_price" : { ---2014年1月的文档做了metrics类型为min的处理后,结果在此
"value" : 80000.0 ---2014年1月的文档中,price字段的最大值
}
},
{
"key_as_string" : "2014-02-01",
"key" : 1391212800000,
"doc_count" : 1,
"max_price" : {
"value" : 25000.0
},
"min_price" : {
"value" : 25000.0
}
},
......
上面的请求是以一个月作为区间的,如果想以其他时间单位作为区间又该怎么做呢?例如90天,把interval字段写成90d即可,其他粒度的时间间隔写法如下表
5.ranges 自定义范围聚合查询
GET /tt11/_search
{
"size": 0,
"aggs": {
"tt": {
"range": {
"field": "classification_score",
"ranges": [
{
"from": 0, >=0
"to": 2 <2
},
{
"from": 2, >=0
"to": 4 <4
},
{
"from": 4 <4
}
]
}
}
}
}