使用Elasticsearch过滤查询的正确方法? (过滤vs过滤查询)

时间:2015-03-18 20:11:45

标签: elasticsearch

如果Elasticsearch中的“过滤器”和“已过滤的查询”之间存在差异,我正在尝试解决。

以下两个示例请求在针对我的索引运行时会返回相同的结果。

它们是否真的以某种微妙的方式不同?

在不同情况下,是否有人会优先选择其他人?

DSL提供一个顶级query一个顶级filter

GET /index/type/_search?_source
{
  "query": {
    "multi_match": {
      "query": "my dog has fleas",
      "fields": ["name", "keywords"]
    }
  },
  "filter": {
    "term": {"status": 2}
  }
}

DSL使用query构造提供顶级filtered

GET /index/type/_search?_source
{
  "query": {
    "filtered": {
      "query": {
        "multi_match": {
          "query": "my dog has fleas",
          "fields": ["name", "keywords"]
        }
      },
      "filter": {
        "term": {"status": 2}
      }
    }
  }
}

1 个答案:

答案 0 :(得分:11)

第一个示例是post_filter,从性能角度来看,这是次优的。首选过滤查询,因为过滤器将在查询之前运行。通常,您希望首先运行过滤器,因为评分文档比布尔传递/失败更昂贵。这样,在对其运行查询之前,会减少结果集。使用post_filter,首先运行查询,对整个结果集进行评分,然后将过滤器应用于结果。

顶级filter指令在1.0中已弃用,并已重命名为post_filter以阐明其用途和用法。

  

搜索中的顶级过滤器参数已重命名为post_filter,表示不应将其用作过滤搜索结果的主要方式(改为使用过滤后的查询),而只是过滤结果/结点后的结果已经计算好了。

http://www.elastic.co/guide/en/elasticsearch/reference/current/_search_requests.html