跳转到内容

搜索引擎召回与排序:决定排名的两阶段漏斗 | 一次搜索的一生

关于搜索引擎,最普遍、也最误导人的心智模型是这样一句话:

搜索引擎给每个网页算一个分,然后从高到低排出来。

这句话足够直觉,也足够错。它错在把一个两阶段的漏斗压缩成了一个单阶段的排序。而几乎所有关于「为什么我的页面权重很高却根本搜不到」「为什么内容更好却排在后面」的困惑,根源都在于混淆了这两个阶段。

这篇文章要做的,是把这个漏斗拆开。它是我们全部后续讨论的骨架——召回门槛、权威性排序、行为信号、查询理解,都挂在这两个阶段上。


一、为什么「打分再排序」在物理上不可能

Section titled “一、为什么「打分再排序」在物理上不可能”

先做一道算术题。一个通用搜索引擎的索引规模在百亿到千亿网页量级。用户对响应时间的容忍度是几十到几百毫秒。而排序阶段真正精细的打分模型(下文会讲到的 learning-to-rank 模型)对单个文档的一次打分,往往涉及成百上千维特征的提取与一次树模型或神经网络前向计算。

把这三个数字放在一起:在几百毫秒内,对上百亿文档、每个都跑一遍上千维的精算模型——这需要的算力比整个搜索引擎的机房还多好几个数量级。它在物理上不可能。

于是,所有现代搜索引擎都被同一个约束逼到了同一个架构上:先廉价地筛掉 99.99%,再昂贵地精算剩下的。 这不是某一家的工程选择,而是「海量文档 + 实时响应 + 复杂打分」这三个条件的数学必然。百度、360、搜狗、Google 在这一点上没有分歧。


一次查询在引擎内部大致经历这样的路径:

用户 query 召回 Recall 倒排索引 · term 匹配 · 求全 粗排 coarse 轻量模型 · 快速收窄 精排 Ranking LTR · 上千维特征 · 求准 SERP 结果页 ≈ 109 数十亿网页 103–104 候选集 ≈ 102 送入精排

「粗排」是召回和精排之间的缓冲层——用一个比精排便宜、比召回精细的模型把候选进一步收窄。它是同一逻辑的延伸,不改变故事的主线。故事的主线是最上和最下那两层,它们的性格截然相反。

召回:一个高查全率的布尔过滤器

Section titled “召回:一个高查全率的布尔过滤器”

召回阶段的数据结构是倒排索引(inverted index):从「词」映射到「包含这个词的文档列表」。当 query 进来,引擎把它切成若干 term,去倒排索引里取出每个 term 的文档列表,做交集/并集,得到候选集。文档级别的遍历策略(term-at-a-time / document-at-a-time)和剪枝算法(如 WAND)决定了它能在毫秒级完成对百亿文档的扫描。

召回阶段的目标函数是查全率(recall)——它最怕的不是「放进来一个不相关的」,而是「漏掉一个相关的」。因为漏掉的文档,后面所有阶段再也没有机会把它捞回来。

这里有一个后面会反复用到的性质:

排序:一个连续可竞争的打分场

Section titled “排序:一个连续可竞争的打分场”

一旦进了候选集,游戏就完全变了。排序阶段不再问「相关不相关」,而是问「在这几千个都相关的文档里,谁最该排在最前面」。

这里用的是 learning-to-rank(LTR):把「排序」建模成一个监督学习问题,用大量特征(内容质量、链接权威、用户行为、领域匹配……)喂给一个模型(历史上是 RankSVM、GBRank 这类树模型,近年是 LambdaMART 乃至深度模型),输出一个可比较的分数。

排序阶段是连续的、可竞争的:每个文档都有一个实数分,多 0.1 分就可能前进几位,各特征之间可以互相补偿——链接权威弱一点,可以靠内容质量或用户行为补回来。


三、漏斗为什么不可逆:排序信号救不了召回

Section titled “三、漏斗为什么不可逆:排序信号救不了召回”

现在把两层的性格并排放在一起,一个极其重要、却极其反直觉的结论就浮出来了。

召回 Recall排序 Ranking
目标查全率:别漏精度:排对
输出二元(进/不进)连续(实数分)
主要信号term 匹配、索引可达性权威、行为、内容质量……
特征间关系硬约束可互相补偿
成本极低(倒排扫描)极高(精算模型)

关键在最后一栏的对比:召回是硬约束,排序是软竞争。 由此推出一条几乎所有人都会踩的认知陷阱:

这不是「劣势」,是「缺席」。劣势可以靠别的特征补偿(那是排序阶段的逻辑),缺席不能——因为你不在被打分的那几千个里面。很多 SEO 直觉之所以时灵时不灵,正是因为它们默认了「一切都能靠堆信号补回来」,而这只在排序阶段成立,在召回阶段完全失效。

这条原理顺带解释了 SEO 行业一个长期存在的困惑。以点击行为操纵为核心的一类技术——业内常称作「百度快排」「点击快排」,本质是向排序层持续注入「有利的用户行为信号」,试图把一个页面往前推。用漏斗的视角看,它的能力边界一目了然:这类快排作用于排序层,因此只能撬动已经进入候选集的词。 对那些页面本就在候选集内、只是排在中后段的词,注入行为信号确实可能快速见效;而对那些页面根本没进候选集的词,无论注入多少点击,都不会有任何效果——因为它连被打分的资格都没有。「百度快排对有些词立竿见影、对有些词毫无作用」,答案不在快排本身,而在这个词命中的是漏斗的哪一层。这也是为什么单纯依赖行为信号的 SEO 快排有一道天然天花板:它跨不过召回这道闸门。

这条原理有一个更学术的名字:可召回性(retrievability)。信息检索研究早已把它单独度量——一个文档 dd 的可召回性,粗略地是「在所有可能的查询下,dd 落入候选集(且在可见截断内)的加权次数」:

r(d)=qQoqf(kdq,c)r(d) = \sum_{q \in Q} o_q \cdot f(k_{dq},\, c)

其中 qq 遍历查询分布 QQoqo_q 是查询权重(越常被搜的词权重越高);kdqk_{dq} 是文档 dd 在查询 qq 下的位次;cc 是可见截断阈值;示性函数 ffkdqck_{dq} \le c(即 dd 落入可见候选)时取 11,否则取 00

它衡量的不是「排得好不好」,而是根本能不能被这套检索系统够到。可召回性低的文档,对搜索引擎而言近乎不存在——无论它本身质量如何。

可见性,是排序的前提,而不是排序的结果。


把漏斗想清楚,很多问题会自动重新排序。「我的站排不上去」这句话,第一步要拆成两个完全不同的问题:

  1. 它进候选集了吗?(召回问题)——如果没有,任何排序层面的努力都是空转,得先解决可召回性。
  2. 它进了候选集但排在后面吗?(排序问题)——这才轮到权威、行为、内容质量这些可竞争的信号上场。

这两个问题的答案、诊断方法、可用手段,几乎没有交集。把它们分开,是理解搜索引擎的第一性原理。

后续几篇会沿着这个漏斗往下走:

  • 召回门槛 —— 把第三节那条「不可逆」原理讲透:什么决定了一个文档的可召回性,为什么它是一道二元的闸门。
  • 相关性之上的权威性 —— 进入排序阶段后,为什么「相关」只是入场券,而「是否可信、是否正确」才主导名次;LTR 里的特征是如何被加权的。
  • 链接即投票 —— 权威性为什么是一个图上的传播量,而不是单个页面的属性。
  • 行为信号与反馈闭环 —— 点击、停留、pogo 如何被当作隐式的相关性反馈,以及它们自带的偏差。
  • 查询理解与自动补全 —— 漏斗最上游:在召回发生之前,引擎如何理解、补全、改写用户的意图。

搜索引擎是一个黑盒,但它不是一团混沌。它有清晰的分层结构,每一层遵循可被推导、可被验证的原理。看清漏斗,是把黑盒变成白盒的第一步。