搜索引擎召回与排序:决定排名的两阶段漏斗 | 一次搜索的一生
关于搜索引擎,最普遍、也最误导人的心智模型是这样一句话:
搜索引擎给每个网页算一个分,然后从高到低排出来。
这句话足够直觉,也足够错。它错在把一个两阶段的漏斗压缩成了一个单阶段的排序。而几乎所有关于「为什么我的页面权重很高却根本搜不到」「为什么内容更好却排在后面」的困惑,根源都在于混淆了这两个阶段。
这篇文章要做的,是把这个漏斗拆开。它是我们全部后续讨论的骨架——召回门槛、权威性排序、行为信号、查询理解,都挂在这两个阶段上。
一、为什么「打分再排序」在物理上不可能
Section titled “一、为什么「打分再排序」在物理上不可能”先做一道算术题。一个通用搜索引擎的索引规模在百亿到千亿网页量级。用户对响应时间的容忍度是几十到几百毫秒。而排序阶段真正精细的打分模型(下文会讲到的 learning-to-rank 模型)对单个文档的一次打分,往往涉及成百上千维特征的提取与一次树模型或神经网络前向计算。
把这三个数字放在一起:在几百毫秒内,对上百亿文档、每个都跑一遍上千维的精算模型——这需要的算力比整个搜索引擎的机房还多好几个数量级。它在物理上不可能。
于是,所有现代搜索引擎都被同一个约束逼到了同一个架构上:先廉价地筛掉 99.99%,再昂贵地精算剩下的。 这不是某一家的工程选择,而是「海量文档 + 实时响应 + 复杂打分」这三个条件的数学必然。百度、360、搜狗、Google 在这一点上没有分歧。
二、漏斗的两层
Section titled “二、漏斗的两层”一次查询在引擎内部大致经历这样的路径:
「粗排」是召回和精排之间的缓冲层——用一个比精排便宜、比召回精细的模型把候选进一步收窄。它是同一逻辑的延伸,不改变故事的主线。故事的主线是最上和最下那两层,它们的性格截然相反。
召回:一个高查全率的布尔过滤器
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)。信息检索研究早已把它单独度量——一个文档 的可召回性,粗略地是「在所有可能的查询下, 落入候选集(且在可见截断内)的加权次数」:
其中 遍历查询分布 ; 是查询权重(越常被搜的词权重越高); 是文档 在查询 下的位次; 是可见截断阈值;示性函数 在 (即 落入可见候选)时取 ,否则取 。
它衡量的不是「排得好不好」,而是根本能不能被这套检索系统够到。可召回性低的文档,对搜索引擎而言近乎不存在——无论它本身质量如何。
可见性,是排序的前提,而不是排序的结果。
四、这把它带到哪里
Section titled “四、这把它带到哪里”把漏斗想清楚,很多问题会自动重新排序。「我的站排不上去」这句话,第一步要拆成两个完全不同的问题:
- 它进候选集了吗?(召回问题)——如果没有,任何排序层面的努力都是空转,得先解决可召回性。
- 它进了候选集但排在后面吗?(排序问题)——这才轮到权威、行为、内容质量这些可竞争的信号上场。
这两个问题的答案、诊断方法、可用手段,几乎没有交集。把它们分开,是理解搜索引擎的第一性原理。
后续几篇会沿着这个漏斗往下走:
- 召回门槛 —— 把第三节那条「不可逆」原理讲透:什么决定了一个文档的可召回性,为什么它是一道二元的闸门。
- 相关性之上的权威性 —— 进入排序阶段后,为什么「相关」只是入场券,而「是否可信、是否正确」才主导名次;LTR 里的特征是如何被加权的。
- 链接即投票 —— 权威性为什么是一个图上的传播量,而不是单个页面的属性。
- 行为信号与反馈闭环 —— 点击、停留、pogo 如何被当作隐式的相关性反馈,以及它们自带的偏差。
- 查询理解与自动补全 —— 漏斗最上游:在召回发生之前,引擎如何理解、补全、改写用户的意图。
搜索引擎是一个黑盒,但它不是一团混沌。它有清晰的分层结构,每一层遵循可被推导、可被验证的原理。看清漏斗,是把黑盒变成白盒的第一步。