专业书籍精读 · System Design Interview 卷一 · 第 13 章

设计搜索自动补全

System Design Interview Vol 1 · Ch 13 · Alex Xu · 2020

EN →

这一章讲什么?

你在搜索框里刚敲下两个字母,下面立刻掉出一串候选词,点一下就走——这就是搜索自动补全。《系统设计面试》第 13 章要你把它从零设计出来。它看着最不起眼,却是全书里「读」和「写」悬殊得最厉害的一道题。

先说个怪事

你以为自动补全是「一边打字一边帮你搜」。恰恰相反——它从来不搜。真要现搜一次,人早把整个词打完了。它做的是查一张早就排好的表:你敲的每一个字母,只是去表里认领一份写好的答案。

旧世界为什么难

难在量。一千万人每天各搜十次,就是一天一亿次搜索;可一次搜索平均要敲二十个字母,而每敲一下都是一次请求——后台一天就要接住二十亿次,平均每秒两万多次,高峰翻倍。而且每一次都得在一眨眼之内回来,慢一点下拉框就会一顿一顿地跳。让数据库现去几十亿条历史搜索里翻「以 tr 开头、最热门的五条」,一次都嫌慢,何况每秒两万次。

它是怎么做到的

两个关键动作。

第一,把所有历史搜索按字母排成一棵岔路树:敲 t 走一条岔路,再敲 r 又分一次岔——树上每个路口就代表一个开头。这样「走到 tr 这个路口」只跟你敲了几个字母有关,跟库里存着几亿还是几十亿条完全无关。

第二步才是真正的窍门:在每个路口提前立一块路牌,写死「从这儿往下走,最热门的就是这五条」。于是查询彻底不用再往下走——走到路口,把牌子上的字抄给你就完事。牌子上写什么,是每周夜里把上一周的搜索日志重新统计、重排一遍写上去的,和白天的查询根本不打照面。

该怎么选

代价也很清楚:牌子是上周立的,昨天才火起来的新词今天补不出来——想让突发热词几分钟内进候选,就得另搭一条实时通道,复杂度和成本一起翻上去,多数场景并不值得。

一句话记住

自动补全不是搜索,是查表:把热门搜索排成一棵按字母分岔的树,在每个岔路口提前把「最热的五条」写死;白天只管取牌子,重写牌子的活留给每周一次的离线任务。

想进到具体机制、量级和示意图? → 切到精读版