我们说我在这里解释了类似的情况: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-post-filter.html
在我偶然发现这篇文章之前,我一直在使用filter而不是post_filter来实现这种情况,它产生的输出就像post_filter一样。
我的问题是:它们是一样的吗?如果没有,哪一个是推荐的,更有效的方法,为什么?
答案 0 :(得分:14)
就搜索匹配而言,它们是相同的,即根据filtered
查询中的过滤器或过滤器中的过滤器正确过滤您获得的匹配你的post_filter
。
但是,就聚合而言,最终结果将不同。两者之间的差异归结为将计算聚合的文档集。
如果您的过滤器位于filtered
查询中,那么您的汇总将在filtered
查询中的查询和过滤器选择的文档集上计算,即您将在回复中获得的同一组文件。
如果您的过滤器位于post_filter
,那么您的汇总将在您的各种查询选择的文档集上计算。一旦在该文档集上计算了聚合,后者将被post_filter
中的过滤器进一步过滤,然后返回匹配的文档。
总结一下,
filtered
查询会影响搜索结果和汇总 post_filter
仅影响搜索结果,但不影响汇总 答案 1 :(得分:3)
在我的测试中,我发现过滤器的行为与post_filter完全相同。两者都只影响命中部分。
答案 2 :(得分:1)
filter
和post_filter
之间的另一个重要区别在以下任何答案中均未提及: 性能 。
TL; DR
除非您确实需要使用post_filter
进行汇总,否则请不要使用。
警告:性能方面的考虑
如果需要差异过滤搜索,请仅使用 post_filter 结果和汇总。有时人们会使用
post_filter
常规搜索。不要这样做!
post_filter
的性质意味着它在之后运行 查询,因此过滤的任何性能优势(例如缓存)都是 完全迷路了。
post_filter
仅应与 聚合,并且仅当您需要差分过滤时。