提问要多花一点心思哦

es按照时间粒度聚合查询数据结果比实际数据多

Timor 回复了问题 • 2 人关注 • 2 个回复 • 1771 次浏览 • 2019-10-11 10:13 • 来自相关话题

exception caught on transport layer

doom 回复了问题 • 2 人关注 • 1 个回复 • 2094 次浏览 • 2019-10-11 07:15 • 来自相关话题

数值的keyword字段排序

trycatchfinal 回复了问题 • 3 人关注 • 4 个回复 • 3010 次浏览 • 2019-10-11 10:31 • 来自相关话题

elasticsearch7.2.0 源码导入idea 运行异常 An SPI

回复

shiyu1992 发起了问题 • 1 人关注 • 0 个回复 • 1586 次浏览 • 2019-10-10 18:31 • 来自相关话题

Elasticsearch集群规划求助

chencandong 回复了问题 • 7 人关注 • 2 个回复 • 3375 次浏览 • 2019-10-11 14:49 • 来自相关话题

多种场景下的融合搜索有什么比较合理的方案呢?

core_wzw 回复了问题 • 4 人关注 • 3 个回复 • 1998 次浏览 • 2019-10-11 14:38 • 来自相关话题

es集群某个数据节点宕机,然后又恢复了,会发生什么?

sec_master 回复了问题 • 4 人关注 • 5 个回复 • 17559 次浏览 • 2019-10-16 17:34 • 来自相关话题

运行ElastAlert后,在哪里可以看到由ElastAlert反馈的日志信息?

回复

orli 发起了问题 • 1 人关注 • 0 个回复 • 3204 次浏览 • 2019-10-10 15:07 • 来自相关话题

ES Aggs根据聚合的结果(数值)进行过滤

ziyou 发表了文章 • 1 个评论 • 23800 次浏览 • 2019-10-10 14:32 • 来自相关话题

前言

我们在使用聚合时总是有各种各样的聚合需求,其中一个比较常用的就是根据聚合的结果过滤聚合的桶,例如:1、每个IP登录次数超过5次的IP;2、每个IP登录人数超过2的IP。
还有我之前的一个案例,[访问量超过1000的人数](
https://elasticsearch.cn/article/13435),这些都是很常见的统计需求。

案例需求

我们在使用聚合计算的时候一般都有两类,一种是计算文档的数量,另一种是计算文档内字段的值的数量(去重计算)或者值的数学计算。两种聚合计算在过滤的时候采用不同的方法来计算。

我们使用以下案例来说明两种过滤的不同:
用户每次登录都会记录一个登录记录:
JSON<br /> {"userID":"a","IP":"10.70.25.1","time":"2019-10-10 12:12:12.222"}<br />
然后提出以下两个需求:
1、每个IP登录次数超过5次的IP;
2、每个IP登录人数超过2的IP。


实现

每个IP登录次数超过5次的IP

这个是对登录记录个数的桶聚合统计,然后过滤。使用IP做term聚合,就可以得出每个IP的登录次数,然后term聚合中有一个参数min_doc_count这个字段就可以对文档数量进行过滤,具体的语句如下:
查询语句
JSON<br /> {<br /> "aggs": {<br /> "IP": {<br /> "terms": {<br /> "field": "IP",<br /> "size": 3000,<br /> "order": {<br /> "_count": "desc"<br /> },<br /> "min_doc_count": 5<br /> }<br /> }<br /> },<br /> "size": 0<br /> }<br />
结果
JSON<br /> {<br /> "took" : 614,<br /> "timed_out" : false,<br /> "num_reduce_phases" : 3,<br /> "_shards" : {<br /> "total" : 1105,<br /> "successful" : 1105,<br /> "skipped" : 75,<br /> "failed" : 0<br /> },<br /> "hits" : {<br /> "total" : 2826,<br /> "max_score" : 0.0,<br /> "hits" : [ ]<br /> },<br /> "aggregations" : {<br /> "IP" : {<br /> "doc_count_error_upper_bound" : 0,<br /> "sum_other_doc_count" : 0,<br /> "buckets" : [<br /> {<br /> "key" : "10.25.90.139",<br /> "doc_count" : 61<br /> },<br /> {<br /> "key" : "10.25.78.146",<br /> "doc_count" : 45<br /> },<br /> {<br /> "key" : "10.25.94.22",<br /> "doc_count" : 21<br /> },<br /> {<br /> "key" : "10.25.75.52",<br /> "doc_count" : 18<br /> },<br /> {<br /> "key" : "10.25.89.32",<br /> "doc_count" : 13<br /> },<br /> {<br /> "key" : "10.25.93.243",<br /> "doc_count" : 10<br /> },<br /> {<br /> "key" : "10.25.78.189",<br /> "doc_count" : 9<br /> },<br /> {<br /> "key" : "10.25.90.82",<br /> "doc_count" : 8<br /> },<br /> {<br /> "key" : "10.25.91.240",<br /> "doc_count" : 8<br /> },<br /> {<br /> "key" : "10.25.90.57",<br /> "doc_count" : 7<br /> },<br /> {<br /> "key" : "10.25.91.251",<br /> "doc_count" : 7<br /> },<br /> {<br /> "key" : "10.25.95.166",<br /> "doc_count" : 6<br /> },<br /> {<br /> "key" : "10.25.89.33",<br /> "doc_count" : 5<br /> },<br /> {<br /> "key" : "10.25.90.88",<br /> "doc_count" : 5<br /> },<br /> {<br /> "key" : "10.25.92.53",<br /> "doc_count" : 5<br /> }<br /> ]<br /> }<br /> }<br /> }<br />

每个IP登录人数超过2的IP

这个是对登录记录用户ID的去重数聚合,然后过滤。对用户ID进行去重可以使用Cardinality Aggregation聚合,然后再使用Bucket Selector Aggregation聚合过滤器过滤数据。具体内容如下:
查询语句
JSON<br /> {<br /> "aggs": {<br /> "IP": {<br /> "terms": {<br /> "field": "IP",<br /> "size": 3000,<br /> "order": {<br /> "distinct": "desc"<br /> },<br /> "min_doc_count": 5<br /> },<br /> "aggs": {<br /> "distinct": {<br /> "cardinality": {<br /> "field": "IP.keyword"<br /> }<br /> },<br /> "dd":{<br /> "bucket_selector": {<br /> "buckets_path": {"userCount":"distinct"},<br /> "script": "params.userCount > 2"<br /> }<br /> }<br /> }<br /> }<br /> },<br /> "size": 0<br /> }<br />
结果
JSON<br /> {<br /> "took" : 317,<br /> "timed_out" : false,<br /> "num_reduce_phases" : 3,<br /> "_shards" : {<br /> "total" : 1105,<br /> "successful" : 1105,<br /> "skipped" : 75,<br /> "failed" : 0<br /> },<br /> "hits" : {<br /> "total" : 2826,<br /> "max_score" : 0.0,<br /> "hits" : [ ]<br /> },<br /> "aggregations" : {<br /> "IP" : {<br /> "doc_count_error_upper_bound" : 0,<br /> "sum_other_doc_count" : 0,<br /> "buckets" : [<br /> {<br /> "key" : "10.25.75.52",<br /> "doc_count" : 18,<br /> "distinct" : {<br /> "value" : 4<br /> }<br /> },<br /> {<br /> "key" : "10.25.78.146",<br /> "doc_count" : 45,<br /> "distinct" : {<br /> "value" : 3<br /> }<br /> },<br /> {<br /> "key" : "10.25.90.139",<br /> "doc_count" : 61,<br /> "distinct" : {<br /> "value" : 3<br /> }<br /> },<br /> {<br /> "key" : "10.25.91.240",<br /> "doc_count" : 8,<br /> "distinct" : {<br /> "value" : 3<br /> }<br /> },<br /> {<br /> "key" : "10.25.94.22",<br /> "doc_count" : 21,<br /> "distinct" : {<br /> "value" : 3<br /> }<br /> }<br /> ]<br /> }<br /> }<br /> }<br />

桶聚合选择器:
https://www.elastic.co/guide/e ... .html

Java代码bulkrequest导入数据丢失

core_wzw 回复了问题 • 2 人关注 • 3 个回复 • 2837 次浏览 • 2019-10-11 14:50 • 来自相关话题

如何配置es的专门监控集群,将生产环境集群和监控集群分开?

回复

shwtz 回复了问题 • 1 人关注 • 1 个回复 • 2746 次浏览 • 2019-10-10 17:12 • 来自相关话题

长时间不访问后查询缓慢(求大佬救命)

ziyou 回复了问题 • 2 人关注 • 1 个回复 • 1639 次浏览 • 2019-10-10 14:53 • 来自相关话题

es分片策略

fantuan 回复了问题 • 3 人关注 • 2 个回复 • 9059 次浏览 • 2019-10-11 10:03 • 来自相关话题

elasticsearch 分组聚合。不管用为啥,和查询出来结果是一样的。

回复

getecms 发起了问题 • 1 人关注 • 0 个回复 • 1322 次浏览 • 2019-10-10 10:54 • 来自相关话题

es内存设置为系统的一半,只对数据节点有效吗

回复

wangxinrong 回复了问题 • 2 人关注 • 2 个回复 • 2002 次浏览 • 2019-10-11 10:12 • 来自相关话题