计算距离(calculate_distance)

计算向量之间的距离

本主题介绍了如何使用 Milvus 计算向量之间的距离。

Milvus 基于向量的距离计算搜索最相似的向量。反之,您也可以使用 Milvus 计算向量之间的距离,使用适合特定场景的距离度量。更多信息请参见相似度度量

以下示例模拟了您想要计算集合中向量与其他向量之间距离的情况。

准备向量

准备用于计算的向量。

需计算的向量在向量类型和维度上必须一致。

Python Java GO Node.js CLI Curl

vectors_left = {
    "ids": [0, 1], 
    "collection": "book", 
    "partition": "_default", 
    "field": "book_intro"
}
import random
external_vectors = [[random.random() for _ in range(2)] for _ in range(4)]
vectors_right = {"float_vectors": external_vectors}
 
// Node User Guide will be ready soon.
 
// GO User Guide will be ready soon.
 
// Java User Guide will be ready soon.
 
// CLI User Guide will be ready soon.
 
vectors_left='{
  "dim": 2,
  "ids": {
    "id_array": [1,2],
    "collection_name": "book",
    "partition_names": ["_default"],
    "field_name": "book_intro"
  }
}'
vectors_right='{
  "dim": 2,
  "vectors": [1,2,3,4,5,6,7,8] # The numbers in the list will be automatically split into four vectors. 
}'
 

以下是经过整理后的表格:

参数描述选项
vectors_leftvectors_right运算符左边和右边的向量。字典格式,可表示为 {"ids": [主键1,主键2,...主键n],"collection": "collection_name","partition":"partition_name","field": "vector_field_name"}{"float_vectors": [[1.0,2.0],[3.0,4.0],... [9.0,10.0]]},或 {"bin_vectors": [b'”',b'N',... b'Ê']}N/A
ids集合中实体的主键列表。N/A
collection包含实体的集合名称。N/A
partition包含实体的分区名称。N/A
field集合中所需矢量字段的名称。N/A
float_vectorsbin_vectors矢量的类型。N/A
参数描述选项
dim向量的维度。N/A
id_array集合中实体的主键列表。N/A
collection_name包含实体的集合的名称。N/A
partition_names包含实体的分区的名称。N/A
field_name集合中所需矢量字段的名称。N/A
vectors目前仅支持浮点向量。N/A

准备计算参数

指定用于计算的参数。

Python Java GO Node.js CLI Curl

params = {
    "metric": "IP", 
    "dim": 2
}
 
// Node User Guide will be ready soon.
 
// GO User Guide will be ready soon.
 
// Java User Guide will be ready soon.
 
// CLI User Guide will be ready soon.
 
params='[
  {"key": "metric", "value": "IP"}
]'
 
参数描述选项
params计算参数。N/A
metric用于计算的度量类型。对于浮点向量:L2(欧几里得距离)和IP(内积)。 对于二进制向量:JACCARD(Jaccard距离)、TANIMOTO(Tanimoto距离)、HAMMING(Hamming距离)、SUPERSTRUCTURE(超级结构)和SUBSTRUCTURE(子结构)。
dim向量的维度。N/A

以下是经过整理后的表格:

参数描述选项
metric用于计算的度量类型。对于浮点向量:L2(欧几里得距离)和IP(内积)。对于浮点向量: - L2(欧几里得距离) - IP(内积)

加载集合 (Optional) Load collection

如果在Milvus中计算集合中的向量,必须先将集合加载到内存中。

Python Java GO Node.js CLI Curl

from pymilvus import Collection
collection = Collection("book")      # Get an existing collection.
collection.load()
 
await milvusClient.loadCollection({
  collection_name: "book",
});
 
err := milvusClient.LoadCollection(
  context.Background(),   // ctx
  "book",                 // CollectionName
  false                   // async
)
if err != nil {
  log.Fatal("failed to load collection:", err.Error())
}
 
milvusClient.loadCollection(
  LoadCollectionParam.newBuilder()
    .withCollectionName("book")
    .build()
);
 
load -c book
 
curl -X 'POST' 
  'http://localhost:9091/api/v1/collection/load' 
  -H 'accept: application/json' 
  -H 'Content-Type: application/json' 
  -d '{
    "collection_name": "book"
  }'
 

计算向量距离

根据提供的向量和参数计算向量之间的距离。

from pymilvus import utility
results = utility.calc_distance(
    vectors_left=vectors_left, 
    vectors_right=vectors_right, 
    params=params
)
print(results)
 
// Node User Guide will be ready soon.
 
// GO User Guide will be ready soon.
 
// Java User Guide will be ready soon.
 
// CLI User Guide will be ready soon.
 
curl -X 'GET' 
  'http://localhost:9091/api/v1/distance' 
  -H 'accept: application/json' 
  -H 'Content-Type: application/json' 
  -d "{
    "op_left": $vectors_left,
    "op_right": $vectors_right,
    "params": $params
  }"
 

Output:

{"status":{},"Array":{"FloatDist":{"data":[3,7,11,15,4,10,16,22]}}}
 

接下来是什么