假设我在这里解释了类似的情况: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 只影响搜索结果,但不影响聚合filter和之间的另一个重要区别post_filter在任何答案中都没有提到:性能。
长话短说
\n\npost_filter除非您确实需要它进行聚合,否则不要使用它。
来自权威指南:
\n\n\n\n警告:性能考虑
\n\n仅当您需要差异化过滤搜索结果和聚合时才使用post_filter 。 有时人们会用于常规搜索。
\n\npost_filter不要\xe2\x80\x99 这样做!它的本质意味着它在查询之后
\n\npost_filter运行,因此过滤(例如缓存)的任何性能优势都将完全丧失。应该
\npost_filter仅与聚合结合使用,并且仅在需要差异过滤时使用。
| 归档时间: |
|
| 查看次数: |
7122 次 |
| 最近记录: |