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,这个解释有点太简洁了我。

请教或指出这些差异的文件,谢谢。

差异与性能有关。 查询总是执行顶层的“filter”。 这意味着查询在所有文档上执行,对所有文档计算得分等 – 只有那些不匹配filter的文档才被排除。

使用“过滤”查询,ES有可能优化计算,例如首先执行filter,然后在有限的文档集上执行查询,从而节省testing与查询不匹配的文档的时间,以及为他们计算得分,如果他们匹配查询。

如果您使用相同的筛选器执行多个查询,则还有更多的优点:可以caching筛选器,进一步提高每个查询的性能。 这适用于您的示例:默认情况下,“term”filter被caching。

您也可以明确地控制“过滤”查询的执行(请参阅文档),以针对您的特定用例对其进行优化。

两种types的滤波器也可以称为前置滤波器和后置滤波器。 正如@alexey所解释的那样,在查询之前执行了根级filter,并且在过滤后的查询中执行了过滤。

此外,您需要了解同一个人的影响,然后他们执行的顺序。 “已过滤”查询中的filter位于查询范围之下,这意味着在计算聚合时将会考虑过滤的输出,而在根级别filter聚合将仅针对不包括filter的查询结果的情况下执行。 虽然在这两种情况下结果文件将是相同的。

例如,对于您发布的两个查询,两者都会得到相同的结果,但是如果您正在执行聚合,则第一个查询将计算匹配标题kitchen3和price 10000的文档的聚合计数,而第二个查询将计算匹配标题kitchen3只有价格1000没有filter。