搜索核心算法:从召回到排序

现代搜索引擎的核心框架的确可以概括为 召回(Recall)排序(Ranking) 两大环节。

在大规模工业系统中,这个流程通常被细化为 召回 → 粗排 → 精排 → 重排 的级联架构,但本质上仍属于"先找到候选集,再对候选集排序"。


1. 召回 ------ 从海量候选里"捞"出相关项

目标:快速、高覆盖地从亿级甚至十亿级文档中,挑出几百到几千个可能相关的候选。

  • 特点

    • 速度极快(毫秒级)
    • 可容忍一定粗糙度
    • 高召回率,尽量少漏掉有用结果
  • 常用方法

    • 倒排索引 + 关键词匹配:传统文本搜索基础,如 BM25。
    • 向量语义召回:通过 Embedding 做近似最近邻(ANN)搜索,捕捉字面不匹配但语义相关的内容。
    • 多路召回并行:结合个性化召回、地理位置召回、热门召回、实时召回等多条策略,结果合并后送入下游。

没有高质量的召回,后续排序再精细也无的放矢。


2. 排序 ------ 对候选集"排好队"

目标:精准评估每条候选的得分,把最满足用户需求的结果放到最前面。

  • 特点

    • 模型更复杂,特征更丰富(点击率、相关性、时效性、用户画像等)
    • 处理的文档量已由召回大幅缩减
  • 常见分层

    • 粗排:用轻量模型(如双塔、简单逻辑回归)将候选从几千个快速减到几百个,缓解精排压力。
    • 精排:用复杂的深度模型(如 DeepFM、DIN)逐条精细打分,追求最准确的效果。
    • 重排:在精排结果之上进行多样性控制、业务规则干预(如去重、打散同类目、插入广告、强插内容)。

3. 容易被忽略的关键环节

查询理解(排序前)

对用户输入的 Query 进行:

  • 意图识别、实体识别
  • 分词、纠错、改写、联想
  • 同义词扩展、权重分配

查询理解的质量直接决定了召回和排序的天花板。

重排 & 混排(排序后)

在生成最终展示列表前,需要加入:

  • 多样性打散(避免同一类内容扎堆)
  • 广告、运营位、推荐结果的混排
  • 业务规则(如黑白名单、最小间隔数)

4. 整体流程示意

bash 复制代码
用户 Query
│
▼
[ 查询理解 ] → 纠错/改写/权重
│
▼
[ 多路召回 ] → 倒排召回 + 向量召回 + 个性化召回 ...
│
▼
[ 粗排 ] → 轻量模型快速过滤
│
▼
[ 精排 ] → 深度模型精准打分
│
▼
[ 重排 ] → 多样性 & 业务规则干预
│
▼
最终展示结果

5. 总结

  • 召回和排序是搜索系统最核心的两大骨架。
  • 实际工业系统会拆分为更多层(粗排、精排、重排),本质仍是"召回 → 排序"思想的延续。
  • 系统优化的大部分精力都集中在:
    如何召回更多真正相关的东西 以及 如何把它们排得更符合用户预期

如果想继续深入,可以沿着 多路召回策略、粗精排模型选型、重排多样性算法 这几个方向研究。

相关推荐
sheeta19981 小时前
LeetCode 每日一题笔记 日期:2026.05.31 题目:2126. 摧毁小行星
笔记·算法·leetcode
INGNIGHT1 小时前
984.不含 AAA 或 BBB 的字符串(贪心)
开发语言·算法·leetcode
飞天狗1111 小时前
2025第十六届蓝桥杯c/c++B组国赛题解
c语言·c++·算法·蓝桥杯
超梦dasgg1 小时前
Tarjan算法解 强连通分量 & 循环依赖
算法·深度优先·图论
散峰而望2 小时前
【算法练习】算法练习精选:从 Phone numbers 到 Decrease,覆盖字符串、模拟、图论思维题
数据结构·c++·算法·贪心算法·github·动态规划·图论
人道领域2 小时前
【LeetCode刷题日记】538.把二叉搜索树转换为累加树
java·开发语言·后端·算法·leetcode
Lsk_Smion2 小时前
力扣实训 _ [33].搜索旋转排序数组 _ [92].翻转链表Ⅱ
java·数据结构·算法
MrZhao4002 小时前
多 Agent 协作与通信:MessageBus 最小实现
算法
Zhang~Ling2 小时前
二叉搜索树(BST)详解:插入、删除、查找与 Key/Value 实战场景
数据结构·c++·算法