[英]ElasticSearch: post_filter or filter?
假设我在这里解释了类似的情况: https : //www.elastic.co/guide/en/elasticsearch/reference/current/search-request-post-filter.html
在我偶然发现这篇文章之前,我一直在使用filter而不是post_filter来实现这种情况,它产生的输出就像post_filter一样。
我的问题是:它们是一样的吗? 如果没有,哪一个是推荐的,更有效的方法,为什么?
就搜索命中而言,它们是相同的,即根据filtered
查询中的过滤器或post_filter
中的filtered
器正确过滤您获得的命中。
但是,就聚合而言,最终结果将不同。 两者之间的差异归结为将计算聚合的文档集。
如果您的过滤器位于filtered
查询中,那么您的聚合将根据查询所选的文档集和filtered
查询中的filtered
,即您将在响应中获得的同一组文档。
如果您的过滤器位于post_filter
,那么您的聚合将在您的各种查询选择的文档集上计算。 一旦在该文档集上计算了聚合,后者将由post_filter
的过滤器进一步过滤,然后返回匹配的文档。
把它们加起来,
filtered
查询会影响搜索结果和聚合 post_filter
只影响搜索结果,但不影响聚合 在我的测试中,我发现过滤器的行为与post_filter完全相同。 两者都只影响命中部分。
filter
和post_filter
之间的另一个重要区别是在任何答案中都没有提到: 性能 。
TL; DR
不要使用post_filter
除非您确实需要它进行聚合。
来自权威指南 :
警告:性能考虑因素
仅当您需要差异过滤搜索结果和聚合时, 才使用post_filter 。 有时人们会使用
post_filter
进行常规搜索。不要这样做!
post_filter
的本质意味着它在查询之后运行,因此过滤(例如缓存)的任何性能优势都会完全丧失。
post_filter
只能与聚合一起使用,并且仅在需要差异过滤时才使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.