聚合分为三大类:
- 度量聚合:在一组文档中对某一个数字字段进行计算得出指标值
- 分组聚合:创建多个分组,每个分组都关联一个关键字和相关文档标准。当聚合执行的时候,所有的分组会根据自身标准评估每一个符合的文档。(分组聚合可以嵌套一个或者多个字聚合)
- 管道聚合:这一类聚合的数据源是其他聚合的输出,然后进行相关指标的计算。
分组聚合
分组聚合不像度量聚合那样通过字段进行计算,而是根据文档创建分组
1. 直方图集合
直方图集合是一个多分组聚合。可以动态生成间隔分组
{
"size":0,
"aggs":{
"price_histogram":{
"histogram":{
"field":"price",
"interval":150
}
}
}
}
得出结果是[0, 150) 有3个,[150, 300) 有0个, [300, MAX) 有一个
因为[150, 300) 有0个 ,若想要让他不显示出,则可以假如一个“min_doc_count”:1 这个表示最少要有一个文档
{
"size":0,
"aggs":{
"price_histogram":{
"histogram":{
"field":"price",
"interval":150,
"min_doc_count":1
}
}
}
}
没有 150
1.1 extended_bounds
可以强制直方图聚合从指定的最小值开始分组,直到最大值(即使没有任何文档存在)
{
"size":0,
"aggs":{
"price_histogram":{
"histogram":{
"field":"price",
"interval":100,
"extended_bounds":{
"min":0,
"max":500
}
}
}
}
}
1.2 排序
{
"size":0,
"aggs":{
"price_histogram":{
"histogram":{
"field":"price",
"interval":100,
"order":{
"_key":"desc"
}
}
}
}
}
或者
{
"size":0,
"aggs":{
"price_histogram":{
"histogram":{
"field":"price",
"interval":100,
"order":{
"_count":"desc"
}
}
}
}
}
2. 日期直方图聚合
只能处理日期型的值
{
"size":0,
"aggs":{
"book_publishDate":{
"date_histogram":{
"field":"publishDate",
"interval":"day"
}
}
}
}
可用的时间间隔:year/month/week/day/hour/quarter/minute/second
3. 时间范围聚合
与普通的范围聚合最大的区别是,from和to参数值可以使用日期数学表达式,注意每个范围包含from 不包含to
{
"size":0,
"aggs":{
"book_publishDate":{
"date_range":{
"field":"publishDate",
"format":"yyyy-MM-dd",
"ranges":[
{"from":"now-4d/d"},
{"to":"now-4d/d"}
]
}
}
}
}
说明:现在时间减去4天,如下图,可以看到2018-08-13 之前没有,之后有4条
4. 范围聚合
范围聚合的每个范围内包含from但是排除to
这个有点类似直方图聚合,只不过,直方图是有规律的范围查询,而范围聚合,是可以自定义范围去聚合
{
"size":0,
"aggs":{
"price_ranges":{
"range":{
"field":"price",
"ranges":[
{"to":100},
{"from":100,"to":300},
{"from":300}
]
}
}
}
}
5. 过滤聚合
{
"size":0,
"aggs":{
"price_java":{
"filter":{
"match":{
"title":"java"
}
},
"aggs":{
"price_avg":{
"avg":{
"field":"price"
}
}
}
}
}
}
查询java书籍价格的平均值
6. 多重过滤聚合
多重过滤聚合是定义一个多分组聚合,每个分组关联一个过滤条件,并收集所有满足自身过滤条件的文档
{
"size":0,
"aggs":{
"messages" : {
"filters":{
"filters" :{
"infos":{
"term":{
"type":"info"
}
},
"errors":{
"term":{
"type":"error"
}
}
}
},
"aggs":{
"monthly":{
"date_histogram":{
"field":"logTime",
"interval":"month"
}
}
}
}
}
}
从结果来看,聚合会创建两个关于日志数据的分组,一个收集info级别,一个收集error级别,并且是按月份划分
other_bucket_key
用来收集所有没有匹配到任何给出的过滤条件的文档
{
"size":0,
"aggs":{
"messages" : {
"filters":{
"other_bucket_key":"other_message",
"filters" :{
"infos":{
"term":{
"type":"info"
}
},
"errors":{
"term":{
"type":"error"
}
}
}
},
"aggs":{
"monthly":{
"date_histogram":{
"field":"logTime",
"interval":"month"
}
}
}
}
}
}
7. 空值聚合
对字段值为空或者null的文档进行分组
{
"size":0,
"aggs":{
"without_price":{
"missing":{
"field":"price"
}
}
}
}
8. 索引词聚合
{
"size":0,
"aggs":{
"terms_type":{
"terms":{
"field":"type"
}
}
}
}
9. ip聚合
{
"size":0,
"aggs":{
"ip_ranges":{
"ip_range":{
"field":"ip",
"ranges":[
{"to":'10.0.0.10'},
{"from":'10.0.0.10',"to":'10.0.0.100'},
{"from":'10.0.0.100'}
]
}
}
}
}