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

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

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


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

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

  • 特点

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

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

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


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

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

  • 特点

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

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

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

查询理解(排序前)

对用户输入的 Query 进行:

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

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

重排 & 混排(排序后)

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

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

4. 整体流程示意

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

5. 总结

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

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

相关推荐
旖旎夜光几秒前
LeetCode 315: 算右侧小于当前元素的个数(归并排序) —— 题解
c++·学习·算法·leetcode·排序算法
像风一样自由20209 分钟前
2.如何用FastAPI把一个Python算法封装成HTTP服务
python·算法·fastapi
D e re k ZH15 分钟前
保序回归:从 PAVA 到可并堆的单调约束优化
c++·算法·数据挖掘·回归·kotlin
青少儿编程课堂16 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:字典树前缀树与单词检索统计
c++·python·算法·bfs·信息学竞赛
Nuanyt19 分钟前
LeetCode Hot 100 链表专题2 3 题 (Java)
java·笔记·算法·leetcode·链表
海绵宝宝转agent1 小时前
LeetCodehot100题解
java·笔记·学习·算法·leetcode·深度优先
青少儿编程课堂1 小时前
2026蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:堆排序与优先队列解析
c++·python·算法·bfs·信息学竞赛
SZYSK2 小时前
OpenHarmony 上读卡、推理和双屏刷新抢 CPU:核验机与消费机的调度差
物联网·算法·harmonyos·1024程序员节
Ivanqhz2 小时前
MoE + LLM 应用
数据库·人工智能·pytorch·python·深度学习·算法·1024程序员节
lpfasd1232 小时前
推荐算法进化史
算法·机器学习·推荐算法