在 elasticsearch 官方文档中 : https://www.elastic.co/guide/cn/elasticsearch/guide/current/_filter_bucket.html
有一段代码 :
GET /cars/transactions/_search
{
"size" : 0,
"query":{
"match": {
"make": "ford"
}
},
"aggs":{
"recent_sales": {
"filter": {
"range": {
"sold": {
"from": "now-1M"
}
}
},
"aggs": {
"average_price":{
"avg": {
"field": "price"
}
}
}
}
}
}
然后官网介绍是: "但是如果我们只想对聚合结果过滤怎么办?假设我们正在为汽车经销商创建一个搜索页面, 我们希望显示用户搜索的结果,但是我们同时也想在页面上提供更丰富的信息,包括(与搜索匹配的)上个月度汽车的平均售价。
这里我们无法简单的做范围限定,因为有两个不同的条件。搜索结果必须是ford
,但是聚合结果必须满足ford
ANDsold > now - 1M
。
为了解决这个问题,我们可以用一种特殊的桶,叫做filter
(注:过滤桶)"
这段话说的我不太理解, 首先, 在 aggs 中的 filter 完全可以写到 query 中的呀, 并不是一定要写到 aggs 中, 也可能是因为我对 elasticsearch 的聚合查询并不了解, 请问各位大佬, 如果将 filter 写到 query 中可行吗, filter 写到 query 中, 和 写到 aggs 中有什么区别吗?在我这里看起来, 我认为完全可以在过滤后再进行查询, 那么就在 query 中使用 bool 查询,将 range 查询和 match 查询连接起来就可以了.
我不知道在 aggs 中使用 filter 有什么用处?能结合实际场景帮助我理解吗.谢谢大家,感激.
理论上似乎没啥区别,但是最新版本的官方文档,建议把 filter 写到 query中。
For example, use this:
Instead of this:
https://www.elastic.co/guide/...