题目重点:Staff Screening 题目只点名 Yelp 搜索系统设计;本文明确训练查询与规模,从商家索引、地理过滤、文本相关性和新鲜度推导方案。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版输入为 (位置、可选关键词、类别、营业状态),输出分页商家列表;范围内商家优先保证地理相关,再按文本相关性、质量和距离排序。
- 假设 1 亿商家、10 万 QPS、商家信息分钟级更新、营业状态秒到分钟级变化;这些不是题目数字。
- 地理位置可能来自用户设备,必须受权限与隐私设置约束;无定位时按输入城市或明确默认位置搜索。
解题路线
- 写入链路将商家静态资料、类别、位置与文本字段规范化,经异步索引任务写倒排索引与地理 cell 索引;记录版本并支持全量回建。
- 查询先校验 location/radius 和关键词,取相交地理 cell 的候选;关键词查询走倒排召回,再按 geo 距离做精确过滤,避免仅依赖 cell 粗筛。
- 排序阶段组合文本 BM25 类相关性、距离、评分、评价样本量、营业与新鲜度;先定义主排序目标和业务约束,权重经离线/在线评估。
- 营业状态和临时关闭更新快,可放近实时覆盖层,读取时把覆盖合并到基索引;店铺删除或安全封禁要更强的可见性 SLA。
- 游标分页包含 query/filter、索引快照和最后排序键;避免深 offset 翻页成本与更新时重复/漏项。
- 处理商家密集区热点、拼写纠错、同名商家、冷启动与欺诈评价;监控无结果率、点击到到店/下单转化、距离分布和结果新鲜度。
手动走一遍
用户在曼哈顿搜‘ramen’,半径 2km。地理 cell 先给粗候选,倒排索引给名称/菜品命中;精确距离剔除 2km 外商家。营业覆盖层把刚关门商家降权或过滤,排序结果按稳定游标翻页。若用户拒绝定位,要求输入城市而非默默使用旧 GPS。
规模与取舍
候选商家 C、文本命中 M,索引交集/地理过滤代价取决于 posting list 与 cell 密度;重排 top K 可 O(C log K),结果缓存受位置网格、关键词、营业状态组合影响。训练 10 万 QPS 与 1 亿商家需压测热点城市和空查询,不可只按平均商家密度估算。
易错点与追问
容易失分的边界
- 把地理 cell 命中当精确半径,边界处返回范围外商家。
- 只按星级排序,忽略少量评论、距离和文本意图。
- 用深 offset 分页,索引更新后结果重复/漏项且查询昂贵。
- 商家紧急封禁仍依赖小时级全量索引重建。
- 把题目只有‘Yelp 搜索’的题名包装成上述具体原题约束。
继续深挖
- 如果用户查询‘附近现在营业的素食拉面’,查询解析与多约束召回怎样做?
- 跨城市热门词与商圈热点如何分片/缓存?
- 评分造假和赞助排序怎样隔离于自然相关性?
- 多语言商家名与拼写纠错怎样评估?
