背景
我们在实际业务场景中会遇到聚合筛选的需求,需要先分组然后聚合,再通过聚合的结果进行筛选,关系型数据库中有having或者子查询来实现,ES中key使用 bucket_selector 来实现此功能
实际业务场景 sapv博客之家
需要找出下单次数大于等于2单,并且平均下单金额大于等于100的客户
- 在关系型数据库中对应的SQL语句
SELECT
userId,
AVG(amount) avgAmount,
count(*) orderCount
FROM type_order
GROUP by userId
HAVING avgAmount >= 100 and orderCount >=2
- ES 的 query
GET index_test/type_order/_search
{
"size": 0,
"aggs": {
"groupUserId": {
"terms": {
"field": "userId"
},
"aggs": {
"avgAmount": {
"avg": {
"field": "amount"
}
},
"having": {
"bucket_selector": {
"bucket