ElasticSearch:post_filter还是过滤?

时间:2015-08-19 02:26:43

标签: elasticsearch

我们说我在这里解释了类似的情况: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-post-filter.html

在我偶然发现这篇文章之前,我一直在使用filter而不是post_filter来实现这种情况,它产生的输出就像post_filter一样。

我的问题是:它们是一样的吗?如果没有,哪一个是推荐的,更有效的方法,为什么?

3 个答案:

答案 0 :(得分:14)

搜索匹配而言,它们是相同的,即根据filtered查询中的过滤器或过滤器中的过滤器正确过滤您获得的匹配你的post_filter

但是,就聚合而言,最终结果将不同。两者之间的差异归结为将计算聚合的文档集。

如果您的过滤器位于filtered查询中,那么您的汇总将在filtered查询中的查询和过滤器选择的文档集上计算,即您将在回复中获得的同一组文件。

如果您的过滤器位于post_filter,那么您的汇总将在您的各种查询选择的文档集上计算。一旦在该文档集上计算了聚合,后者将被post_filter中的过滤器进一步过滤,然后返回匹配的文档。

总结一下,

  • filtered查询会影响搜索结果和汇总
  • 虽然post_filter 仅影响搜索结果,但不影响汇总

答案 1 :(得分:3)

在我的测试中,我发现过滤器的行为与post_filter完全相同。两者都只影响命中部分。

答案 2 :(得分:1)

filterpost_filter之间的另一个重要区别在以下任何答案中均未提及: 性能

TL; DR

除非您确实需要使用post_filter进行汇总,否则请不要使用。

来自The Definitive Guide

  

警告:性能方面的考虑

     

如果需要差异过滤搜索,请仅使用 post_filter   结果和汇总。有时人们会使用post_filter   常规搜索。

     

不要这样做! post_filter的性质意味着它在之后运行   查询,因此过滤的任何性能优势(例如缓存)都是   完全迷路了。

     

post_filter仅应与   聚合,并且仅当您需要差分过滤时。