题目重点:支持用户文本状态的布尔搜索,分析有序posting交并集、索引更新、分片和权限。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练查询由规范化词项组成,只要求AND/OR,不要求相关性排序。AND优先于OR或必须显式括号需约定;示例查询采用AST避免语法含糊。
- 权限、删除状态和索引版本影响可见结果。私密状态不能因词项命中就直接返回给任何搜索者。
- 容量例1亿文档,每篇平均20个不同词产生约20亿posting;docId仅8字节约16GB下限,需另加位置、压缩索引、词表和复制。
解题路线
- 写入文档事实与outbox,consumer按统一tokenization/case/stemming策略生成unique term→docId posting;query必须使用同样分析器。是否去停用词会改变“全部词匹配”的含义,不能擅自删用户词。
- 每posting保持docId有序,AND做交集,OR做并集;先交短列表减少中间集,用跳指针/块最大docId跳过不可能块。无ranking时输出稳定docId顺序或明确分页键。
- 按document分片每shard完整评价AST,聚合匹配;按term分片同一AND可能跨多个shard传输posting做交集,长posting网络重。选择看词频偏斜、更新吞吐和查询组合。
- 更新携docVersion,旧版本consumer不能覆盖新;删除写tombstone并即时在权威读取过滤,随后移除posting。读后权限过滤要在服务端且检查结果分页回补,避免只返回空洞页。
- searchAfter携snapshotEpoch与最后docId,固定epoch提供稳定分页,实时模式接受新写不稳定并说明语义。索引延迟用eventTime水位监测,lag恶化降级而非返回“无结果”掩盖故障。
手动走一遍
A=[1,3,5],B=[3,4,5],AND=[3,5]、OR=[1,3,4,5]。若doc3已删除但posting尚未移除,返回前应过滤;权威状态与索引状态不能以“最终一致”为由暴露内容。
规模与取舍
两有序posting交并为O(a+b)基线,跳表与短表二分在偏斜长度时改进;查询总成本取决于候选集与shard扇出。写入每文档O(uniqueTerms)追加/更新,索引生命周期需合并与压缩。
易错点与追问
容易失分的边界
- 字面AND词项去重不同于文档去重,OR聚合各shard结果必须去重docId。
- 按term consistent hashing不能消除高频词热点,还可能让交集跨网络传巨量数据。
- 只在离线索引过滤权限无法响应实时权限变更。
继续深挖
- 若加入短语查询,posting需存位置并比较相邻偏移;仅docId交集无法保证词语连续。
- 一条状态修改后如何从旧词posting删掉?存doc→旧terms或可恢复分析输入,用版本化差量更新。
