一句话定义
向量检索的过滤陷阱集中在三个放大器上:选择率(条件越苛刻,post-filter 越塌)、基数(字段取值越多,标量索引越肥)、分片键与过滤键错位(本地命中、全局走样)——每个陷阱都有明确的检测信号与标准修法。
为什么重要
过滤类故障的共同特征是"影子故障":单测(小数据、高选择率)全绿,生产上只有特定租户/特定时间段触发,且表现为"查不到"而非报错——业务方往往归咎于"知识库内容不全",真实根因在检索引擎侧。这一篇把 kp-014 的机制展开成可对照的故障手册。
前置知识
kp-014(三种过滤策略与选择率概念);kp-004(召回的可测量性)。
核心概念
- 选择率分桶:把查询按条件命中率分桶(如 0.001/0.01/0.1/0.5)分别评测,是暴露过滤问题的唯一可靠方法。
- 空结果塌陷:post-filter 下
有效返回 ≈ k × 选择率,苛刻条件下系统性返回不足。 - 图剪枝孤岛:过滤感知遍历在合法子图连通性差(数据在空间中分散)时,贪心路径可能困在局部区域。
- 分片键错位:按时间分片但按租户过滤 → 每次查询广播全部分片,p99 = 最慢分片。
原理与机制
六大陷阱与处置(本篇核心,逐条"症状→根因→修法"):
| # | 陷阱 | 症状 | 根因 | 修法 |
|---|---|---|---|---|
| 1 | post-filter 塌陷 | 苛刻条件返回 < k 条甚至空 | ANN 后过滤,k×选择率过小 | 切 pre-filter / 过滤感知遍历 |
| 2 | 低选择率全扫 | 带过滤 p99 比无过滤慢一个量级 | 预过滤集合过小,图导航退化 | filterable 索引或 partition 隔离 |
| 3 | 高基数倒排膨胀 | 内存涨、写入变慢 | user_id 级字段建全量倒排 | 高基数转分片键/分区键 |
| 4 | 分片键错位 | 无过滤快、带过滤慢且方差大 | 过滤字段未做分片/分区键 | 分片键=最高频过滤字段(kp-029) |
| 5 | 删除可见性 | 刚删的记录还在结果里 | tombstone 未合并、一致性级别低(kp-022) | 调一致性级别;理解段合并时机 |
| 6 | ef 救不了过滤 | 调大 efSearch 无效 | ef 扩的是 ANN 候选,过滤在之后发生 | 换过滤执行策略,不是调 ef |
机制要点:陷阱 1/2/6 是同一枚硬币——过滤与 ANN 的执行顺序决定了一切;陷阱 3/4 是数据布局问题,标量索引与分片策略必须按查询模式设计,而不是按表结构顺手建。
公式或模型
判据公式(决定是否必须放弃 post-filter):
若 E[有效返回] = k × selectivity < k_min(业务要求), 则 post-filter 不可用
例: k=10, 要求至少返回 8 条 → 需选择率 ≥ 0.8 才敢用 post-filter图示
选择率 ──► 执行策略决策
≥0.3 : post-filter (便宜)
0.01~0.3: 过滤感知图遍历 (动态 ef)
<0.01 : partition/分片隔离 (把过滤变路由)
高基数 : 永远不建全量倒排, 转分片键实例或案例
在线教育平台故障复盘:客户反馈"新学期课程搜不到"。排查链:接口无错误 → 向量库无报错 → 复现发现 semester=2026秋 过滤选择率 0.003,而该库走 post-filter(k=10),期望返回 0.03 条;切到过滤感知遍历 + 该字段倒排后恢复。教训:新过滤字段上线前必须按选择率分桶评测,而不是只测默认查询。
直观类比
陷阱 4 像图书馆按"到馆年份"排书架,读者却总按"作者"找书——每个书架都要翻一遍。把书架按作者重排(分片键=高频过滤键),一次直达。
常见误区(本篇主题,另附两条高频误判)
- "过滤是索引的附带功能,性能不会差太多"——过滤执行策略可造成 10 倍级延迟差与召回塌陷,必须纳入索引选型(kp-027 的 Q3 判据)。
- "单测通过 = 过滤没问题"——必须用生产分布的选择率分桶数据测;影子故障正是从"测试集选择率偏高"漏出来的。
- "把过滤逻辑挪到应用层做(查回来再筛)最安全"——把塌陷从引擎层搬到了业务层,还多耗网络与带宽;塌陷不会消失,只是更难观测。
自测题
- 检测陷阱 1 的最小实验设计?
- 为什么调大 efSearch 修不了 post-filter 塌陷?
- user_id(千万级取值)要作为过滤条件,怎么设计?
答:取生产查询样本按选择率分桶,对每桶统计"返回条数分布与 recall@k",选择率低于 k×选择率<业务下限的桶即暴露。
答:ef 只增大 ANN 的候选规模,而过滤发生在 ANN 返回之后,k×选择率 的期望结构未变;必须改变执行顺序(预过滤/过滤感知遍历)。
答:不做全量倒排;把 user_id 设为 partition/分片键做物理隔离,查询先路由到目标分片,分片内无需该字段过滤或仅低基数辅助过滤。
与其他知识点的关系
kp-014 提供机制地基;kp-022 的写删语义解释陷阱 5;kp-029 的分片设计是陷阱 3/4 的工程出口;kp-027 把"过滤复杂度"列为选型决策树的正式分支。
延伸阅读
本节不适用:本篇为工程陷阱汇编,源自生产实践与系统设计讨论,无单一经典文献对应。