题目重点:Database Service 岗 SD 问如何给 text string 建 full-text index;从 token、posting、查询/删除、增量合并到分片。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练版每文档有 docId、文本字段和版本,支持关键词 AND/OR 查询及基本相关性排序;真实面试若只需单字符串内搜索应大幅缩小范围。
- 词法处理按具体语言定,大小写、Unicode、停用词、词干化都需版本化;本文不假定英语是唯一内容。
解题路线
- 摄取时先保存文档事实,再 tokenize/normalize,生成 term→按 docId 排序的 posting list,必要时存词频与位置支持短语查询。
- 查询时 term 命中对应 posting,AND 做有序交集、OR 做并集,候选按 BM25/简单词频排序;与原文存储分开,返回摘要需核文档版本。
- 更新采用新版本索引记录+旧版本 tombstone 或原子替换,读取按 docId 最新版本过滤;删除传播到索引、缓存和副本,后台 segment merge 回收。
- 按 docId 分片便于写入与横向扩容,查询广播各分片再 merge top-k;按 term 分片可减少某些查询 fanout 但热点词与多词交集跨分片复杂。
- 估文档数、平均 tokens、更新量、查询 QPS 和 p99,监控索引滞后、召回/排名质量、分片热点、压缩负载与删除一致性。
手动走一遍
训练文档 d1='red house'、d2='blue house':posting(house)=[d1,d2]、posting(red)=[d1],AND(red,house) 得 d1。若 d1 更新为 'green house',查询 red 不应再返回旧版本;增量索引需以版本/tombstone 遮蔽旧 posting。
规模与取舍
建索引与 token 总量近线性,存储 O(总 posting 数);单词查询读取 posting 长度,AND 有序交集 O(p1+p2),top-k 排名至少处理候选。生产成本由分片、压缩与召回目标决定,题目无规模。
易错点与追问
容易失分的边界
- 只说 hash(term→docs) 而不讲多词交集/更新。
- 删除文档后旧 posting 仍可检索。
- 词法规则变更后新旧 segment 混用且无版本。
- 分片设计忽视热点词查询 fanout。
- 把产品 ranking 目标当题目已给需求。
继续深挖
- 短语查询要存什么位置数据?
- 多语言分词如何处理?
- 新文档何时可搜索?
- 百万文档批量更新怎样避免索引抖动?
