前言
我们在使用聚合时总是有各种各样的聚合需求,其中一个比较常用的就是根据聚合的结果过滤聚合的桶,例如:1、每个IP登录次数超过5次的IP;2、每个IP登录人数超过2的IP。
还有我之前的一个案例,访问量超过1000的人数,这些都是很常见的统计需求。
案例需求
我们在使用聚合计算的时候一般都有两类,一种是计算文档的数量,另一种是计算文档内字段的值的数量(去重计算)或者值的数学计算。两种聚合计算在过滤的时候采用不同的方法来计算。
我们使用以下案例来说明两种过滤的不同:
用户每次登录都会记录一个登录记录:
{"userID":"a","IP":"10.70.25.1","time":"2019-10-10 12:12:12.222"}
然后提出以下两个需求:
1、每个IP登录次数超过5次的IP;
2、每个IP登录人数超过2的IP。
实现
每个IP登录次数超过5次的IP
这个是对登录记录个数的桶聚合统计,然后过滤。使用IP做term聚合,就可以得出每个IP的登录次数,然后term聚合中有一个参数min_doc_count这个字段就可以对文档数量进行过滤,具体的语句如下:
查询语句
{
"aggs": {
"IP": {
"terms": {
"field": "IP",
"size