官方文档:https://milvus.io/docs/search.md
本节介绍如何使用 Milvus 搜索实体。
Milvus 中的向量相似度搜索会计算查询向量与具有指定相似度度量的集合中的向量之间的距离,并返回最相似的结果。您可以通过指定过滤标量字段或主键字段的布尔表达式来执行混合搜索。
下面的例子展示了如何对2000行的图书ID(主键)、字数(标量场)、图书介绍(向量场)的数据集进行向量相似度搜索,模拟根据搜索条件搜索某本书的情况关于他们的矢量化介绍。 Milvus 会根据您定义的查询向量和搜索参数返回最相似的结果。
1. 加载集合
在Milvus中,所有的搜索和查询操作都在内存中执行。在进行向量相似度搜索之前,需要将集合加载到内存中。
from pymilvus import Collection
collection = Collection("book") # Get an existing collection.
collection.load()
2. 准备搜索参数
准备适合您的搜索场景的参数。
以下示例定义搜索将使用欧氏距离计算距离,并从 IVF_FLAT 索引构建的十个最接近的簇中检索向量。
search_params = {
"metric_type": "L2",
"offset": 0,
"ignore_growing": False,
"params": {"nprobe": 10}
}
参数介绍:
3. 进行向量搜索
使用 Milvus 搜索向量。要在特定分区中搜索,请指定分区名称列表。
Milvus 支持专门为搜索设置一致性级别。本主题中的示例将一致性级别设置为“Strong”。
您还可以将一致性级别设置为“Bounded有界”、“Session会话”或“Eventually最终”。有关 Milvus 中四个一致性级别的更多信息,请参阅一致性(https://milvus.io/docs/consistency.md)。
使用支持 GPU 的 Milvus 进行向量搜索时,返回的实体数量应满足以下要求:
- GPU_IVF_FLAT:返回的实体数量应小于 256。
- GPU_IVF_PQ:返回的实体数量应小于 1024。
具体如下:参考内存索引(https://milvus.io/docs/index.md)。
示例:
results = collection.search(
data=[[0.1, 0.2]], # 用于搜索的向量。
anns_field="book_intro", # 要搜索的字段的名称。
# the sum of `offset` in `param` and `limit`
# should be less than 16384.
param=search_params, # 特定于索引的搜索参数
limit=10, # 要返回的结果数。该值与 param 中的偏移量之和应小于 16384。
expr=None, # 用于过滤属性的布尔表达式。有关详细信息,请参阅布尔表达式规则(https://milvus.io/docs/boolean.md)。
# set the names of the fields you want to
# retrieve from the search result.
output_fields=['title'], # 要返回的字段的名称
consistency_level="Strong" # 搜索的一致性级别
)
# 查看最相似向量的主键值及其距离、输出的字段。
results[0].ids
results[0].distances
hit = results[0][0]
hit.entity.get('title')
# 当搜索完成时,释放 Milvus 中加载的集合以减少内存消耗。
collection.release()