悟空,拿我的打狗棒来

ES聚合如何实现SQL中的having语句

Elasticsearch | 作者 lzc | 发布于2018年05月14日 | 阅读数:6312

像SQL里面的HAVING语句来过滤聚合结果(例如根据color聚合avg price,要求avg price要大于4000)
采用post_filter好像实现不了
1.png
已邀请:

rockybean - Elastic Certified Engineer, ElasticStack Fans,公众号:ElasticTalk

赞同来自: lzc cccthought

post_filter 是对原始数据做过滤的,不会对聚合起作用,它存在的意义是先做全局的聚合,然后再过滤详细数据,比如一次性获取所有分类的聚合信息和某个分类下的详细数据。可以看官方的示例。
 
你的需求用 pipeline aggregation 中的 bucket selector 可以实现,看下官方的例子好了
 
https://www.elastic.co/guide/e ... .html
 
我还是补一下例子吧……
GET cars/_search
{
"size": 0,
"aggs": {
"colors": {
"terms": {
"field": "color"
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
},
"bucket_filter": {
"bucket_selector": {
"buckets_path": {
"avgPrice": "avg_price"
},
"script": "params.avgPrice>4000"
}
}
}
}
}
}

laoyang360 - 《一本书讲透Elasticsearch》作者,Elastic认证工程师 [死磕Elasitcsearch]知识星球地址:http://t.cn/RmwM3N9;微信公众号:铭毅天下; 博客:https://elastic.blog.csdn.net

赞同来自: lzc

同楼上,举例:
POST book_authors/_search
{
"query":{
"terms":{
"authors": ["张三"]
}
},
"size": 0,
"aggs" : {
"authors_agg": {
"terms": {
"field": "authors"
},
"aggs": {
"count_bucket_filter": {
"bucket_selector": {
"buckets_path": {
"cur_doc_cnt": "_count"
},
"script": "params.cur_doc_cnt > 5"
}
}
}
}
}
}

lzc

赞同来自:

但是 用java来写,应该怎么写呢?如图
 

要回复问题请先登录注册