面试题答案
一键面试常见场景
- 基本过滤 + 后置过滤:在进行搜索时,先用
query
进行基础的条件筛选,例如查找包含特定关键词的文档。之后,使用post_filter
来进一步筛选,如只返回最近一周内创建的文档。这样可以在确保相关性搜索的基础上,对搜索结果进行更细致的过滤。 - 多维度聚合分析:
query
用于匹配符合业务主要搜索需求的文档,而post_filter
用于在聚合分析前对文档进行额外过滤,使得聚合结果更加精准。比如在电商搜索中,query
查找某类商品,post_filter
则过滤出有库存的商品,再进行销量等聚合分析。 - 搜索结果缓存:由于
post_filter
不影响评分,当搜索场景中有缓存需求时,可使用query
进行常规搜索匹配,post_filter
在缓存命中后对缓存结果进行后置过滤,减少缓存的数据量和更新频率。
执行时机差异
query
:在搜索过程中,query
是最先执行的部分。它用于确定哪些文档与搜索请求中的条件相匹配,会遍历索引中的文档,根据定义的查询条件进行筛选。只有通过query
筛选的文档才会进入后续处理阶段。post_filter
:post_filter
在query
筛选出匹配文档、计算完评分并且进行完聚合分析(如果有聚合操作)之后执行。它作用于query
筛选后的结果集,进一步过滤文档。
对评分影响差异
query
:query
不仅决定哪些文档被返回,还会影响文档的评分(_score
)。query
中的条件匹配程度会直接反映在文档的相关性得分上,匹配程度越高,得分越高,文档在搜索结果中的排序也就越靠前。post_filter
:post_filter
只负责对已经通过query
筛选且计算好评分的文档进行再次过滤,它不会影响文档的评分,仅仅是从已有的结果集中剔除不符合post_filter
条件的文档。