如何使用Python-Milvus向量数据库进行向量范围搜索?
摘要:Milvus 向量数据库实践:范围搜索(Range Search)详解 在构建基于向量检索的应用时,我们通常需要从海量向量中找到与查询向量最相似的 Top-K 个结果。然而,在某些场景下,我们不仅需要“最相似”的结果,还需要对相似度设置一个
Milvus 向量数据库实践:范围搜索(Range Search)详解
在构建基于向量检索的应用时,我们通常需要从海量向量中找到与查询向量最相似的 Top-K 个结果。然而,在某些场景下,我们不仅需要“最相似”的结果,还需要对相似度设置一个阈值范围,只返回相似度在一定区间内的向量。这就是范围搜索(Range Search)的用武之地。
范围搜索的核心:radius 与 range_filter
范围搜索不同于传统的 Top-K 检索,它允许你划定一个距离区间,只返回落在这个区间内的向量。但距离的含义取决于所选的度量类型。Milvus 支持多种距离度量,如欧氏距离(L2)、内积(IP)、余弦距离(COSINE)等。不同的度量类型对 radius 和 range_filter 的语义和取值要求不同。
Milvus 中 COSINE 度量返回的是余弦相似度
在 Milvus 中:
metric_type="COSINE" 计算的是余弦相似度(Cosine Similarity),而不是余弦距离。
余弦相似度的取值范围是 [-1, 1](当向量被归一化后,取值范围为 [0, 1],因为非负向量内积非负)。值越大表示两个向量越相似,最大值为 1(向量完全相同)。
对于 COSINE 度量,Milvus 要求:
range_filter 必须大于 radius,否则会触发断言错误。这是因为区间定义为 (radius, range_filter],即距离大于 radius 且小于等于 range_filter。如果 range_filter ≤ radius,区间为空或逻辑错误。
在示例中:
radius = 0.4:过滤掉距离 ≤ 0.4 的高相似度结果(因为距离越小越相似,所以距离 ≤ 0.4 意味着余弦相似度很高,可能接近于1)。
range_filter = 0.9:过滤掉距离 > 0.9 的低相似度结果。
最终返回的是余弦距离在 (0.4, 0.9] 之间的向量。
为什么要有这个限制?
假设你想找出所有与查询向量“比较相似但不完全一致”的向量,就可以设置一个下限(例如 0.4),排除掉那些过于相似的(可能包含查询自身或重复数据),同时设置一个上限(例如 0.9),排除掉那些不太相关的。这种灵活的区间控制在实际业务中非常有用,例如去重、异常检测、多样性采样等。
注意事项
集合必须加载:执行 search 前务必调用 load_collection,否则会报错。
度量类型一致性:search_params 中的参数解释依赖于集合创建时指定的度量类型。如果不确定,可以通过 describe_collection 查看。
参数顺序与逻辑:对于 COSINE 度量,务必确保 range_filter > radius。对于其他度量(如 L2),规则可能不同,需参考官方文档。
范围与 limit 的关系:范围搜索先根据区间过滤,然后从符合条件的结果中取前 limit 个。如果区间内结果不足 limit,则返回实际数量(可能少于 limit)。
性能考虑:范围搜索需要扫描满足距离条件的向量,相比普通 Top-K 可能略慢,但在合理索引支持下仍能高效执行。
