Elasticsearch聚合过滤器根据钥匙的另一个滤波器存储桶的一个过滤器的结果
我想查询类似于
select t1.plate_no,t1.cnt1,t2.cnt2 from
(select plate_no,sum(pass_count) cnt1 from kdmotorvehicle where pass_time > '2022-04-01 03:00:00' group by plate_no having cnt1 >5 ) t1
left join
(select plate_no,sum(pass_count) cnt2 from kdmotorvehicle where pass_time < '2022-05-18 23:00:00' group by plate_no having cnt2 <10 ) t2
on t1.plate_no = t2.plate_no
要实现业务逻辑 使用DSL
Idea是:找出相应的聚合,每个聚合桶中的两个过滤桶,然后要过滤结果合并,
{
"size": 0,
"aggs": {
"before_filter": {
"filter": {
"range": {
"pass_time": {
"gte": "2022-04-06 00:00:00",
"lte": "2022-04-10 23:00:00"
}
}
},
"aggs": {
"group_by_plate_no_color": {
"terms": {
"script": {
"source": "doc['plate_no'].value+','+doc['plate_color'].value",
"lang": "painless"
},
"order": {
"pass_count_total": "desc"
},
"size": 10000
},
"aggs": {
"pass_count_total": {
"sum": {
"field": "pass_count"
}
},
"having": {
"bucket_selector": {
"buckets_path": {
"cnt": "pass_count_total"
},
"script": {
"source": "params.cnt >= params.before_cnt",
"lang": "painless",
"params": {
"before_cnt": 10
}
},
"gap_policy": "skip"
}
}
}
}
}
},
"after_filter": {
"filter": {
"range": {
"pass_time": {
"gte": "2022-04-11 00:00:00",
"lte": "2022-04-16 23:00:00"
}
}
},
"aggs": {
"group_by_plate_no_color": {
"terms": {
"script": {
"source": "doc['plate_no'].value+','+doc['plate_color'].value",
"lang": "painless"
},
"order": {
"pass_count_total": "desc"
},
"size": 10000
},
"aggs": {
"pass_count_total": {
"sum": {
"field": "pass_count"
}
},
"having": {
"bucket_selector": {
"buckets_path": {
"cnt": "pass_count_total"
},
"script": {
"source": "params.cnt <= params.after_cnt",
"lang": "painless",
"params": {
"after_cnt": 1
}
},
"gap_policy": "skip"
}
}
}
}
}
}
}
}
但是,不知道如何说两个桶以合并过滤器的结果,试图使用管道聚合,但是这是只能在过滤桶上使用
I want to query is similar to
select t1.plate_no,t1.cnt1,t2.cnt2 from
(select plate_no,sum(pass_count) cnt1 from kdmotorvehicle where pass_time > '2022-04-01 03:00:00' group by plate_no having cnt1 >5 ) t1
left join
(select plate_no,sum(pass_count) cnt2 from kdmotorvehicle where pass_time < '2022-05-18 23:00:00' group by plate_no having cnt2 <10 ) t2
on t1.plate_no = t2.plate_no
Want to achieve the business logic
use dsl
Idea is: find out the corresponding polymerization, each in two filtering barrel, and then to filter results merging
{
"size": 0,
"aggs": {
"before_filter": {
"filter": {
"range": {
"pass_time": {
"gte": "2022-04-06 00:00:00",
"lte": "2022-04-10 23:00:00"
}
}
},
"aggs": {
"group_by_plate_no_color": {
"terms": {
"script": {
"source": "doc['plate_no'].value+','+doc['plate_color'].value",
"lang": "painless"
},
"order": {
"pass_count_total": "desc"
},
"size": 10000
},
"aggs": {
"pass_count_total": {
"sum": {
"field": "pass_count"
}
},
"having": {
"bucket_selector": {
"buckets_path": {
"cnt": "pass_count_total"
},
"script": {
"source": "params.cnt >= params.before_cnt",
"lang": "painless",
"params": {
"before_cnt": 10
}
},
"gap_policy": "skip"
}
}
}
}
}
},
"after_filter": {
"filter": {
"range": {
"pass_time": {
"gte": "2022-04-11 00:00:00",
"lte": "2022-04-16 23:00:00"
}
}
},
"aggs": {
"group_by_plate_no_color": {
"terms": {
"script": {
"source": "doc['plate_no'].value+','+doc['plate_color'].value",
"lang": "painless"
},
"order": {
"pass_count_total": "desc"
},
"size": 10000
},
"aggs": {
"pass_count_total": {
"sum": {
"field": "pass_count"
}
},
"having": {
"bucket_selector": {
"buckets_path": {
"cnt": "pass_count_total"
},
"script": {
"source": "params.cnt <= params.after_cnt",
"lang": "painless",
"params": {
"after_cnt": 1
}
},
"gap_policy": "skip"
}
}
}
}
}
}
}
}
But, don't know how to speak two barrels to merge the result of the filter, tried to use pipe aggregation, but this can only be used on a filtering barrel
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论