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

bil*_*llc 6 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}
  }
}
Run Code Online (Sandbox Code Playgroud)

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}
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ald 12

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

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

搜索中的顶级过滤器参数已重命名为post_filter,表示不应将其用作过滤搜索结果的主要方式(改为使用过滤后的查询),而仅用于过滤结果后计算构面/聚合.

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