Elasticsearch实用的聚合操作Aggs
es的aggs可以分为度量聚合和桶聚合,下面就直接实战开发中经常用到的语句。
1、度量聚合:min、max、sum、avg聚合, 度量聚合接收一个输入文档集并生成至少一个统计值sum。
1)sum聚合:统计不同日志类型的总数量sum(log_type)
"aggs": {
"sum_logtype": {
"sum": {
"field": "log_type"
} }}
2)count聚合:就是count(*)
"aggs": {
"sum_logtype": {
"count": {
"field": "log_type"
} }}
3)stats聚合:返回所有度量类型的统计
"stats_year": {
"count": 4,
"min": 1886,
"max": 1961,
"avg": 1928,
"sum": 7712
}
4)avg均值聚合:
{
"aggs" : {
"avg_grade" : { "avg" : { "field" : "grade" } }
}}
2、桶聚合
桶聚合返回很多子集,并限定输入数据到一个特殊的叫做桶的子集中。可以把桶聚合想象成
类似前面切面功能的东西。
1、term聚合:词条的聚合
terms聚合为字段中每个词条返回一个桶。这允许你生成字段每个值的统计:例如每年出版多少书。类似于sql语句:count(book) group by year
统计不同日志类型的数量
"aggs": {
"sum_logtype": {
"terms": {
"field": "log_type"
} } }}
结果简单展示如下:
- "buckets": [
- {
- "key": 3,
- "doc_count": 22}
- ,
- {
- "key": 2,
- "doc_count": 11}
- ,
- {
- "key": 1,
- "doc_count": 5}
注意:这里还涉及到两个聚合的属性,一个返回的结果size,一个排序顺序
"size": 40,
"order": { "_term": "asc" }
使用key属性(_team)排序。另一个选择是_count来排序。
2、range聚合和date range聚合
顾名思义,range范围和时间范围聚合,直接上例子
"aggregations": {
"time_range": {
"range": {
"field": "timestamp",
"ranges": [
{
"to": 1487520050000
},
{
"from": 1487520050000,
"to": 1487520150000
},
{
"from": 1487520150000
}
]
}
}
}
如果需要对结果进行备注名称,可以采用参数"keyed": true,如下的语句进行设置key的名称:
"aggregations": {
"time_range": {
"range": {
"field": "timestamp",
"keyed": true,
"ranges": [
{
"key": "small", //可以不用设置,系统会默认制定
"to": 1487520050000
},
{
"key": "middle",
"from": 1487520050000,
"to": 1487520150000
},
{
"key": "big",
"from": 1487520150000
}
]
}
}
}
结果如下:
3)桶嵌套:还可以在聚合的内部再嵌套一个聚合,例如下面再嵌套一个度量的桶,对各个range进行度量统计。
"aggs": {
"time_range": {
"range": {
"field": "timestamp",
"keyed": true,
"ranges": [
{
"key": "small",
"to": 1487520050000
},
{
"key": "middle",
"from": 1487520050000,
"to": 1487520150000
},
{
"key": "big",
"from": 1487520150000
}
]
},
"aggs": {
"time_stat": {
"stats": {
"field": "timestamp"
}
}
} } }
还可以添加排序机制,根据平均值排序,
3)数值和日期直方图切面 Date Histogram Aggregation
数值直方图,这个实际应用中比较经常用到,例如每隔50000ms统计一次数据,用柱形图显示
数值直方图
"aggregations": {
"test": {
"histogram": {
"field": "timestamp",
"interval": 50000
}
}
}
注意有一个参数可以选择设置,小统计值:"min_doc_count" : 640 少满足640才显示
"aggs": {
"test": {
"histogram": {
"field": "timestamp",
"interval": 50000,
"min_doc_count": 640
}
}
}
时间直方图采用date_histogram,原理一样
3、使用过滤器来计算切面,过滤器返回文档数目的切面
谈到性能,filter切面的速度比query切面或包装查询的filter切面更快
一个是查询的过滤,一个是桶里面的过滤,可以看下官方的文档,具体我就不说了
Filter Aggregation | Elasticsearch Reference [6.2] | Elastic例如:
"aggs" : {
"t_shirts" : {
"filter" : { "term": { "type": "t-shirt" } },
"aggs" : {
"avg_price" : { "avg" : { "field" : "price" } }
}
}
}
相关文章