elasticsearch 过滤桶和query中过滤有什么区别?

在 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,但是聚合结果必须满足fordANDsold > now - 1M

为了解决这个问题,我们可以用一种特殊的桶,叫做filter(注:过滤桶)"

这段话说的我不太理解, 首先, 在 aggs 中的 filter 完全可以写到 query 中的呀, 并不是一定要写到 aggs 中, 也可能是因为我对 elasticsearch 的聚合查询并不了解, 请问各位大佬, 如果将 filter 写到 query 中可行吗, filter 写到 query 中, 和 写到 aggs 中有什么区别吗?在我这里看起来, 我认为完全可以在过滤后再进行查询, 那么就在 query 中使用 bool 查询,将 range 查询和 match 查询连接起来就可以了.
我不知道在 aggs 中使用 filter 有什么用处?能结合实际场景帮助我理解吗.谢谢大家,感激.

阅读 3.4k
1 个回答
新手上路,请多包涵

理论上似乎没啥区别,但是最新版本的官方文档,建议把 filter 写到 query中。

To limit the documents on which all aggregations in a search run, use a top-level query. This is faster than a single filter aggregation with sub-aggregations.

For example, use this:

POST /sales/_search?size=0&filter_path=aggregations
{
  "query": { "term": { "type": "t-shirt" } },
  "aggs": {
    "avg_price": { "avg": { "field": "price" } }
  }
}

Instead of this:

POST /sales/_search?size=0&filter_path=aggregations
{
  "aggs": {
    "t_shirts": {
      "filter": { "term": { "type": "t-shirt" } },
      "aggs": {
        "avg_price": { "avg": { "field": "price" } }
      }
    }
  }
}

https://www.elastic.co/guide/...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题