ElasticSearch:post_filter还是过滤?

Sum*_* NL 9 elasticsearch

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

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

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

Val*_*Val 16

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

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

如果您的过滤器在filtered查询中,那么您的聚合将在查询中选择的文档集和查询中的过滤器上计算filtered,即您将在响应中获得的同一组文档.

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

把它们加起来,

  • 一个filtered查询会影响搜索结果和聚合
  • 虽然post_filter 只影响搜索结果,但不影响聚合

  • @AnimeshPandey在ES 2.x(及以后)中,只需用`bool/filter`查询替换`filtered`查询,其余的仍然适用. (2认同)

Tod*_*ier 7

filter和之间的另一个重要区别post_filter在任何答案中都没有提到:性能

\n\n

长话短说

\n\n

post_filter除非您确实需要它进行聚合,否则不要使用它。

\n\n

来自权威指南

\n\n
\n

警告:性能考虑

\n\n

当您需要差异化过滤搜索结果和聚合时才使用post_filter 。 有时人们会用于常规搜索。post_filter

\n\n

不要\xe2\x80\x99 这样做!它的本质意味着它在查询之后post_filter运行,因此过滤(例如缓存)的任何性能优势都将完全丧失。

\n\n

应该post_filter仅与聚合结合使用,并且仅在需要差异过滤时使用。

\n
\n

  • 您的评论可能不再真实。您提供的链接引用了 ElasticSearch 的版本 2。在当前(版本 7,可能更早)版本中不会出现此警告 (4认同)