跳到主要内容

Range Search

Range Search 是一种通过指定搜索结果的相似度得分范围的方式提升 ANN Search 的召回质量的搜索增强方法。本节将介绍如何使用 Range Search 以及相关注意事项。

概述

在执行 Range Search 请求时,Zilliz Cloud 会以 ANN Search 搜索结果中与查询向量最相似的向量为圆心,以 Search 请求中指定的 radius 值为外圆半径,以 range_filter 为内圆半径画两个同心圆。所有相似度得分落在由这两个同心圆构成的圆环上的向量会被返回。其中,range_filter 可以设置为 0,表示返回指定相似度得分 (radius)以内的所有 Entity。

UasowweO3hvOcCb1mZDc0EbunBd

如上图所示,Search 请求中携带了 Range Search 特有的参数 radiusrange_filter。当收到这样的 Search 请求时,Zilliz Cloud 会执行如下操作:

  • 使用指定的相似度类型(COSINE)查找出与查询向量相似的所有向量。

  • 根据指定的 radiusrange_filter 过滤出相似性得分(distancescore)符合要求的向量。

  • 从所有符合要求的向量中返回 topK 个结果。

值得注意的是,根据相似度类型的不同,radius 和 range_filter 的设置也不尽相同。

相似度类型

特点

Range search 参数设置要求

L2

较小的 L2 距离表示更高的相似性。

要排除结果中最近的向量,请确保:

0 <= range_filter <= distance < radius <

IP

较大的 IP 距离表示更高的相似性。

要排除结果中最近的向量,请确保:

-1 <= radius < distance <= range_filter <= 1

COSINE

较大的 cosine 值表示更高的相似性。

要排除结果中最近的向量,请确保:

-1 <= radius < distance <= range_filter <= 1

JACCARD

较小的 Jaccard 距离表示更高的相似性。

要排除结果中最近的向量,请确保:

0 <= range_filter <= distance < radius <= 1

HAMMING

较小的 Hamming 距离表示更高的相似性。

要排除结果中最近的向量,请确保:

0 <= range_filter <= distance < radius <= dim(vector)

操作示例

本节将结合具体的代码示例介绍如何进行 Range Search。

下方的示例未指定相似度类型,表明使用默认相似度类型 COSINE。通过查表可知,在使用 COSINE 对目标向量与查询向量间的相似度进行打分时,值越大越相似。因此在设置 Range Search 相关参数时,需要确保 radius 小于 range_filter

示例 Search 请求中指定的 radius 为 0.4,range_filter 为 0.6。在收到此请求后,Zilliz Cloud 会返回所有与查询向量相似度得分在 0.4 到 0.6 之间的 Entity。

from pymilvus import MilvusClient

client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)

query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]

res = client.search(
collection_name="my_collection",
data=[query_vector],
limit=3,
search_params={
# highlight-start
"params": {
"radius": 0.4,
"range_filter": 0.6
}
# highlight-end
}
)

for hits in res:
print("TopK results:")
for hit in hits:
print(hit)