Easysearch、Elasticsearch 还是 Opensearch,是个问题

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

ziyou 发表了文章 • 1 个评论 • 23953 次浏览 • 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 个回复 • 2872 次浏览 • 2019-10-11 14:50 • 来自相关话题

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

回复

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

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

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

es分片策略

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

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

回复

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

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

回复

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

如何判断Elasticsearch的字段是否是数组

doom 回复了问题 • 2 人关注 • 1 个回复 • 2111 次浏览 • 2019-10-10 00:30 • 来自相关话题

elasticsearch 版本升级问题

core_wzw 回复了问题 • 5 人关注 • 4 个回复 • 3231 次浏览 • 2019-10-11 15:42 • 来自相关话题

DSL语法的执行顺序

core_wzw 回复了问题 • 5 人关注 • 2 个回复 • 3300 次浏览 • 2019-10-11 15:54 • 来自相关话题

ES Aggs 该如何根据查询结果的数量进行过滤

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

求教这种情况下, 如何选择合适的analyzer

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

用springdata 连接elasticsearch ,es有用户名密码,请问如何配置连接?

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

ES是否支持大数据量的历史数据查询

wangxinrong 回复了问题 • 6 人关注 • 7 个回复 • 8875 次浏览 • 2019-10-09 10:12 • 来自相关话题

请问NESTED查询,如何实现not exists逻辑

回复

envy666 回复了问题 • 1 人关注 • 1 个回复 • 3625 次浏览 • 2019-10-08 15:14 • 来自相关话题