一句话定义
标量过滤是在相似度检索之上叠加结构化条件(category=财务 AND created_at>…)的能力;实现光谱从"先检索后过滤"(post-filter)到"先筛集再检索"(pre-filter)再到"过滤感知的图遍历"(filtered HNSW),选择率决定哪种策略不会崩。
为什么重要
真实业务里"纯向量检索"几乎不存在:多租户隔离、权限、时间窗、类目限定都是硬条件。过滤实现选错的表现极具迷惑性——单测全绿,上线后"某些租户查不到东西"或"带过滤的 p99 飙到秒级"。过滤是向量库从算法库走向数据库的分水岭能力(kp-018),也是 kp-017 一整篇陷阱清单的地基。
前置知识
kp-004(ANN 的召回概念——过滤会与"近似"叠加放大问题)。
核心概念
- post-filter(后过滤):先做 top-k ANN,再对返回结果应用条件;实现最便宜。
- pre-filter(预过滤):先用标量索引(倒排/位图)选出满足条件的候选集,再在集合内做 ANN/暴力。
- filterable HNSW / 过滤感知遍历:图遍历时实时检查节点条件,只在合法节点上扩展,并用动态 ef 补偿剪枝(Qdrant 的 filterable HNSW、Milvus 的标量过滤执行是代表)。
- 选择率(selectivity):满足条件的向量占比。0.5 与 0.0001 是两个世界。
- 基数(cardinality):过滤字段的取值数量级,决定倒排/位图索引的形态。
原理与机制
三种策略的失效模式与适用域:
| 策略 | 机制 | 失效场景 | 适用选择率 |
|---|---|---|---|
| post-filter | ANN top-k 后过滤 | 条件苛刻时 k 个全被滤掉,返回 < k(召回塌陷) | 高(>0.3 量级) |
| pre-filter | 标量索引选集 + 集内检索 | 选择率极低时集合太小,图导航无处可走退化全扫;或集合巨大但 ANN 无法受益图结构 | 中低 |
| 过滤感知图遍历 | 遍历中检查条件 + 动态 ef | 图在合法子图上连通性差时延迟上升 | 全域,工程实现是关键 |
成熟系统的做法是混合策略:先估算选择率(元数据统计),高选择率走"ANN 后过滤"(便宜),低选择率自动切换"预过滤或过滤感知遍历"。这要求向量库维护标量索引(倒排表、位图/roaring bitmap)并与向量索引联动——正是 kp-018 中"数据库能力"的具体含义。
公式或模型
post-filter 的返回量期望:
E[有效返回数] ≈ k × selectivity
例: k=10, selectivity=0.02 → 期望仅 0.2 条有效 → 大量查询返回空图示
post: 全图 ANN ──top-k──► [过滤] ──► 可能剩 0~k 条 (便宜但塌陷)
pre : [标量索引]──合法集S──► S 内检索 ──► top-k (S 太小/太大都难受)
graph: ANN 遍历中逐节点查条件, 只扩展合法点 + 动态 ef (工程最优, 实现最难)实例或案例
多租户 SaaS:1000 个租户均分 1 亿向量,单租户查询选择率 0.001。post-filter(k=10)期望返回 0.01 条——完全不可用。正确组合:租户字段建位图/倒排 + 过滤感知图遍历,或干脆每租户独立 partition/collection(把选择率问题转化为路由问题,见 kp-029 的分片讨论)。pgvector 中同一需求表现为 WHERE tenant_id=… ORDER BY embedding <=> q LIMIT 10,需确认规划器真的走了索引扫描(见 kp-020)。
直观类比
在万人会场找"穿红衣服的最像目标的人":post-filter 是先叫出最像的 10 人再看衣服(可能一个红衣都没有);pre-filter 是先把所有红衣人集中到一个小厅再找;过滤感知遍历是"边走边只看红衣人"——各有成本,取决于红衣人比例。
常见误区
- "过滤是检索之后顺手做的事"——策略错了选择率一低就塌;要先问目标过滤字段的选择率分布再定方案。
- "efSearch 调大能救 post-filter"——ef 只扩大 ANN 候选,若过滤在 ANN 之后,k×selectivity 的期望不变;必须换过滤策略而非调 ef。
- "高基数过滤字段(如 user_id 百万级)建倒排就好"——倒排表数量与取值数同阶,内存与维护成本爆炸;高基数应转为 partition/分片键。
自测题
- k=20、选择率 0.05,post-filter 期望返回几条?怎么办?
- 过滤感知图遍历为什么需要"动态 ef"?
- 如何为一个新业务判断过滤实现是否合格?
答:期望 1 条;应切换预过滤或过滤感知遍历,或对关键场景改用 partition 隔离。
答:遍历中被条件剪掉的节点不计入候选,静态 ef 会在低选择率下候选枯竭;按合法候选数动态扩大 ef 才能维持目标召回。
答:按选择率分桶做评测(0.001 / 0.01 / 0.1 / 0.5 各一组查询),分别测召回与 p99,全部桶达标才算合格。
与其他知识点的关系
kp-017 是本篇的陷阱专篇;kp-022 的写删语义决定过滤索引的更新方式;kp-029 的租户分片把低选择率问题变成路由问题。
延伸阅读
Wang et al., "Milvus: A Purpose-Built Vector Data Management System"(SIGMOD 2021)——向量检索与标量过滤联合执行的系统性设计。