SWE · Onsite System Design

LinkedIn Typeahead Suggestions:前缀召回、排序与热键更新

从输入前缀找到候选、按质量与个性化重排,处理热点前缀缓存、索引版本和延迟。

题目重点:从输入前缀找到候选、按质量与个性化重排,处理热点前缀缓存、索引版本和延迟。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练版建议对象为搜索 query;输入是已规范化前缀、locale 和可选用户上下文,输出最多 K 条建议。若真实对象是职位/成员,权限过滤和索引字段须重设。
  • 非空前缀才查;排序结合全局受欢迎度、时效和可选个人历史。输入包含敏感词或用户私有内容时不能直接进入公共建议。

解题路线

  1. 先区分召回与排序:字典树或有序键范围取同前缀候选,热前缀可预先存 Top K;冷前缀走有界范围扫描或前缀倒排。规范化大小写、Unicode 和 locale 时保留展示原文。
  2. 排序把长期点击、近期趋势、质量/安全过滤和个性化特征分层;离线收集 query 与点击日志,在线重排只处理少量候选,避免每个 keystroke 全表扫描。
  3. 缓存键包含前缀、locale、权限范围和排序版本;空前缀、单字符前缀流量特别大,做热键复制、请求合并和客户端 debounce。个性化结果不能误共享跨用户缓存。
  4. 索引增量更新采用版本或时间水位;新趋势可进小型实时 overlay,与离线全量索引合并,去重后重排。若索引或模型延迟超标,回退到安全的全局 Top K。
  5. 评估输入到首个建议的 p95、点击后任务完成、无结果率、错误/冒犯建议率,而非只看建议曝光量。

手动走一遍

用户键入 `data eng`,前缀索引返回 data engineer、data engineering manager 等候选;安全过滤剔除敏感私有 query,排序按地域与近期相关性给前 5 条。热点前缀 `d` 命中预计算缓存;新热词经实时 overlay 出现,夜间全量索引再吸收。

规模与取舍

Trie 查前缀 O(L),取候选约 O(K) 若节点预存 Top K;维护所有前缀 Top K 可达 O(总字符数×K) 存储。范围扫描依命中量 M 为 O(log N+M),之后 M 条重排;真正延迟仍受缓存命中、网络与模型预算影响。

易错点与追问

容易失分的边界

  • 把前缀匹配、排序和敏感内容过滤混为一个黑盒。
  • 每次输入直接查全量排序。
  • 公共缓存包含个性化或权限受限结果。
  • 只更新离线索引,实时趋势一直看不到。
  • 未确认建议对象却把人名权限规则强加到搜索词题。

继续深挖

  • 一字母前缀占 30% 流量怎样分片?
  • 用户停止输入前旧请求才返回,客户端怎样防止乱序覆盖?
  • 如何支持拼写纠错而不损害精确前缀?
  • 索引更新期间怎样维持同一次请求版本一致?
✓已复制微信号!