题目重点:从输入前缀找到候选、按质量与个性化重排,处理热点前缀缓存、索引版本和延迟。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版建议对象为搜索 query;输入是已规范化前缀、locale 和可选用户上下文,输出最多 K 条建议。若真实对象是职位/成员,权限过滤和索引字段须重设。
- 非空前缀才查;排序结合全局受欢迎度、时效和可选个人历史。输入包含敏感词或用户私有内容时不能直接进入公共建议。
解题路线
- 先区分召回与排序:字典树或有序键范围取同前缀候选,热前缀可预先存 Top K;冷前缀走有界范围扫描或前缀倒排。规范化大小写、Unicode 和 locale 时保留展示原文。
- 排序把长期点击、近期趋势、质量/安全过滤和个性化特征分层;离线收集 query 与点击日志,在线重排只处理少量候选,避免每个 keystroke 全表扫描。
- 缓存键包含前缀、locale、权限范围和排序版本;空前缀、单字符前缀流量特别大,做热键复制、请求合并和客户端 debounce。个性化结果不能误共享跨用户缓存。
- 索引增量更新采用版本或时间水位;新趋势可进小型实时 overlay,与离线全量索引合并,去重后重排。若索引或模型延迟超标,回退到安全的全局 Top K。
- 评估输入到首个建议的 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% 流量怎样分片?
- 用户停止输入前旧请求才返回,客户端怎样防止乱序覆盖?
- 如何支持拼写纠错而不损害精确前缀?
- 索引更新期间怎样维持同一次请求版本一致?
