第 120 题:向量检索的过滤条件,标量属性与向量相似度的联合索引?
题目
向量检索的过滤条件,标量属性与向量相似度的联合索引?
完整讲解
一、过滤条件与业务需求
检索不仅按向量相似度排序,还常带标量过滤:类目=某值、价格区间、上架时间、地域等。需求是:在满足过滤条件的候选上做向量 Top-K,或先向量召回再过滤(可能导致不足 K 条)。联合索引即把标量属性与向量放在一起设计与查询,在保证过滤的前提下尽量减少扫描量、保持低延迟。
二、先过滤再向量检索
- 做法:按标量建倒排/二级索引(如类目→doc list、价格→区间索引)。查询时先根据过滤条件取满足条件的 ID 集合,再只对这些 ID 对应的向量做 ANN 或精确 Top-K。这样向量检索只在「过滤后集合」上进行,精度与语义一致。
- 难点:过滤后集合可能很大或很分散,无法直接利用「全库向量」建的 ANN 索引(索引是按全库建的)。需要标量与向量的联合结构:要么对「每个过滤桶」单独建小向量索引(类目 A 一个索引、类目 B 一个索引),要么用支持过滤的索引引擎,在检索时先过滤再在子集上搜。
三、标量属性与向量相似度的联合索引
- 支持过滤的 ANN:部分引擎(如 Faiss 的 IDMap + 过滤、Milvus 的 scalar index + vector index)在检索时先按标量筛出候选分区或 doc list,再在该子集上做向量搜索。底层可以是 IVF:聚类时考虑标量(如按类目分桶再每桶内聚类),或向量索引不变、检索阶段对返回 ID 做标量过滤并重排/补采。
- 复合索引:标量 B+树/倒排 + 向量索引。查询先走标量得 ID 集,再在向量索引中只对这批 ID 做近似搜索(需索引支持「指定 ID 集合」下的搜索,或先取 ID 集再取向量、做精确或小规模 ANN)。
- 预分层:按主要过滤维度(如类目)分层建多个小 ANN 索引,查询时只开满足条件的类目对应索引,合并结果。适合过滤维度离散、取值不多的场景。
四、工程要点
- 过滤过严时候选很少,向量检索几乎退化为精确算;过滤过松则候选多、ANN 范围大。需根据业务分布设计分层或分区,平衡「过滤粒度」与「每层索引大小」。
- 延迟:标量过滤 + 子集向量检索的总延迟要控制;子集过大时可对子集再做 IVF 或图索引的「子索引」。
面试要点
- 能说明业务需求:在满足标量过滤的候选上做向量 Top-K;先过滤再向量检索。
- 能说清联合索引的几种方式:每过滤桶单独建向量索引、支持过滤的 ANN 引擎、标量索引+向量索引组合、按维度分层多索引。
- 能提及过滤过严/过松的权衡、延迟与分区设计。
记忆要点
- 联合索引:标量过滤 + 向量相似度;先满足过滤再在子集上做向量 Top-K。
- 实现:每桶单独小索引、ANN 引擎支持过滤、标量索引+向量子集检索、按维度分层多索引。
- 过滤过严候选少、过松候选多;需按业务设计分区与索引粒度。