假设我在这里解释了一个类似的情况:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-post-filter.html
在我偶然读到这篇文章之前,我一直在为这种场景使用filter而不是post_filter,它产生的输出就像post_filter一样。
我的问题是:它们是同一件事吗?如果不是,推荐使用哪种更有效的方法?为什么?
发布于 2015-08-19 12:36:45
就搜索命中而言,它们是一样的,即您获得的命中结果将根据filtered查询中的过滤器或post_filter中的过滤器进行正确过滤。
然而,就聚合而言,最终结果将不会相同。两者之间的差异归结为将在哪个文档集上计算聚合。
如果您的筛选器位于filtered查询中,则将根据查询选择的文档集和filtered查询中的筛选器计算聚合,即与您将在响应中获得的文档集相同。
如果您的筛选器位于post_filter中,则将在由各种查询选择的文档集上计算聚合。在该文档集上计算聚合后,在返回匹配的文档之前,post_filter中的过滤器会进一步过滤该文档。
总结一下,
filtered query会影响post_filter 只会影响搜索结果,而不会影响aggregations发布于 2019-01-22 01:47:59
filter和post_filter之间的另一个重要区别在任何答案中都没有提到:performance。
TL;DR
除非您确实需要用于聚合,否则不要使用 post_filter 。
警告:性能注意事项
仅当您需要对搜索结果和聚合进行差异化过滤时,才使用post_filter。有时人们会使用post_filter进行常规搜索。
不要这样做!post_filter的性质意味着它在查询之后运行,因此过滤(如缓存)带来的任何性能优势都会完全丧失。
post_filter应仅与聚合结合使用,并且仅当您需要差异筛选时使用。
发布于 2015-08-19 12:36:49
在我的测试中,我发现filter的行为与post_filter完全一样。两者都只影响命中部分。
https://stackoverflow.com/questions/32085557
复制相似问题