一尘不染

Elasticsearch过滤查询与过滤器

elasticsearch

“过滤后的查询和过滤器”与“根查询和过滤器”之间有什么区别吗?例如

情况1:

{
  "query":{
    "filtered":{
      "query":{
        "term":{"title":"kitchen3"}
      },
      "filter":{
        "term":{"price":1000}
      }
    }
  }
}

情况2:

{
  "query":{
    "term":{"title":"kitchen3"}
  },
  "filter":{
    "term":{"price":1000}
  }
}

我在http://elasticsearch-users.115913.n3.nabble.com/Filtered-query-vs-using-
filter-outside-td3960119.html中找到了此讨论,但所引用的URL是404,并且解释过于简洁我。

请示教或提供指出这些区别的任何文件,谢谢。


阅读 671

收藏
2020-06-22

共1个答案

一尘不染

差异与性能有关。查询 始终执行顶层的“过滤器” 。这意味着对所有文档执行查询,为所有文档计算分数,等等。-只有不匹配过滤器的文档才会被排除。

使用“过滤的”查询,ES可能会优化此计算,例如,首先执行过滤器,然后对有限的一组文档执行查询,从而节省了测试与查询不匹配过滤器的文档的时间,以及如果他们确实符合查询条件,则为他们计算分数。

如果使用同一过滤器执行多个查询,则还有更多优点:可以缓存过滤器,从而进一步提高每个查询的性能。这适用于您的示例:默认情况下会缓存“术语”过滤器。

您还可以显式控制“已过滤”查询的执行(请参阅文档),以针对特定用例进行优化。

2020-06-22