以下将详细介绍 Milvus 向量数据库中保存(插入)、删除、查询(query
和 search
)操作的输入输出参数,并给出代码示例。
环境准备
确保已经安装 pymilvus
库,若未安装,可使用以下命令:
pip install pymilvus
连接到 Milvus
from pymilvus import connections
# 连接到 Milvus 服务
connections.connect(
alias="default",
host='localhost',
port='19530'
)
1. 保存(插入)操作
输入参数说明
data
:- 类型:列表,列表中的每个元素对应集合中的一个字段的数据。
- 说明:元素的顺序和类型需与集合定义中的字段一致。例如,如果集合有
id
、vector
、name
三个字段,那么data
列表可能是[[id1, id2], [vector1, vector2], ["name1", "name2"]]
。
collection_name
:- 类型:字符串
- 说明:要插入数据的集合名称。
partition_name
(可选):- 类型:字符串
- 说明:指定数据要插入的分区名称,如果不指定则插入到默认分区。
输出参数说明
返回一个 InsertResult
对象,包含以下字段:
primary_keys
:- 类型:列表
- 说明:插入记录的主键值列表,可用于后续对这些记录的引用。
insert_count
:- 类型:整数
- 说明:成功插入的记录数量。
代码示例
from pymilvus import Collection, FieldSchema, CollectionSchema, DataType
import random
# 定义集合字段
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=False),
FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=128),
FieldSchema(name="name", dtype=DataType.VARCHAR, max_length=64)
]
# 创建集合模式
schema = CollectionSchema(fields=fields, description="Example collection")
# 创建集合
collection = Collection(name="my_collection", schema=schema)
# 准备插入的数据
ids = [1, 2]
vectors = [[random.random() for _ in range(128)] for _ in range(2)]
names = ["Alice", "Bob"]
data = [
ids,
vectors,
names
]
# 插入数据
result = collection.insert(data)
print(f"插入记录的主键值列表: {result.primary_keys}")
print(f"成功插入的记录数量: {result.insert_count}")
# 刷新集合以确保数据可见
collection.flush()
2. 删除操作
输入参数说明
expr
:- 类型:字符串
- 说明:删除条件表达式,使用类似 SQL 的布尔表达式语法,用于指定要删除的记录。例如
"id == 1"
表示删除id
为 1 的记录。
collection_name
:- 类型:字符串
- 说明:要删除数据的集合名称。
partition_name
(可选):- 类型:字符串
- 说明:指定要在哪个分区执行删除操作,如果不指定则在整个集合中删除。
输出参数说明
返回一个 DeleteResult
对象,包含以下字段:
deleted_count
:- 类型:整数
- 说明:成功删除的记录数量。
代码示例
# 定义删除条件
expr = "id == 1"
# 删除符合条件的记录
result = collection.delete(expr)
print(f"成功删除的记录数量: {result.deleted_count}")
# 刷新集合以确保删除操作生效
collection.flush()
3. 查询(query
)操作
输入参数说明
expr
:- 类型:字符串
- 说明:查询条件表达式,使用类似 SQL 的布尔表达式语法,用于筛选符合条件的记录。例如
"id > 0"
表示查询id
大于 0 的记录。
output_fields
:- 类型:列表
- 说明:指定要返回的字段名称列表。例如
["id", "name"]
表示返回id
和name
字段的值。
offset
(可选):- 类型:整数
- 说明:查询结果的偏移量,默认为 0。用于分页查询,例如
offset = 10
表示从第 10 条记录开始返回结果。
limit
(可选):- 类型:整数
- 说明:返回结果的最大数量,默认为无穷大。例如
limit = 10
表示最多返回 10 条记录。
collection_name
:- 类型:字符串
- 说明:要查询数据的集合名称。
partition_names
(可选):- 类型:列表
- 说明:指定要在哪些分区进行查询,如果不指定则在整个集合中查询。
consistency_level
(可选):- 类型:字符串
- 说明:查询的一致性级别,默认为集合的默认一致性级别。常见的一致性级别有
"Strong"
、"Bounded"
等。
输出参数说明
返回一个列表,列表中的每个元素是一个字典,字典的键为 output_fields
中指定的字段名,值为对应字段的值。例如:
[
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"}
]
代码示例
# 定义查询条件
expr = "id > 0"
# 执行查询操作,指定返回的字段
results = collection.query(
expr=expr,
output_fields=["id", "name"]
)
# 打印查询结果
for result in results:
print(f"ID: {result['id']}, Name: {result['name']}")
4. 查询(search
)操作
输入参数说明
data
:- 类型:列表
- 说明:查询向量列表,每个向量的维度必须与集合中向量字段的维度一致。例如
[[0.1] * 128]
表示一个维度为 128 的查询向量。
anns_field
:- 类型:字符串
- 说明:指定进行向量搜索的字段名。例如
"vector"
表示在vector
字段上进行向量搜索。
param
:- 类型:字典
- 说明:搜索参数,根据不同的索引类型有不同的参数设置。例如对于
HNSW
索引,可能包含"M"
、"efConstruction"
等参数;对于IVF
索引,可能包含"nlist"
、"nprobe"
等参数。
limit
:- 类型:整数
- 说明:指定返回的相似向量的最大数量。例如
limit = 10
表示返回最相似的 10 条记录。
expr
(可选):- 类型:字符串
- 说明:查询表达式,用于在向量搜索前对数据进行过滤。例如
"id > 0"
表示只在id
大于 0 的记录中进行向量搜索。
output_fields
(可选):- 类型:列表
- 说明:指定需要返回的非向量字段名称列表。例如
["id", "name"]
表示除了返回相似记录的距离和主键外,还返回id
和name
字段的值。
collection_name
:- 类型:字符串
- 说明:要查询数据的集合名称。
partition_names
(可选):- 类型:列表
- 说明:指定要在哪些分区进行搜索,如果不指定则在整个集合中搜索。
consistency_level
(可选):- 类型:字符串
- 说明:查询的一致性级别,默认为集合的默认一致性级别。
输出参数说明
返回一个列表,列表中的每个元素是一个 Hits
对象,Hits
对象包含以下字段:
ids
:- 类型:列表
- 说明:相似记录的主键值列表。
distances
:- 类型:列表
- 说明:查询向量与相似记录的距离值列表。
entities
:- 类型:列表
- 说明:每个元素是一个字典,包含
output_fields
中指定的非向量字段的值。
代码示例
# 准备查询向量
query_vector = [[random.random() for _ in range(128)]]
# 定义搜索参数
search_params = {
"metric_type": "L2",
"params": {"nprobe": 10}
}
# 执行搜索操作
results = collection.search(
data=query_vector,
anns_field="vector",
param=search_params,
limit=10,
expr="id > 0",
output_fields=["id", "name"]
)
# 打印搜索结果
for hits in results:
for i in range(len(hits.ids)):
print(f"ID: {hits.ids[i]}, Distance: {hits.distances[i]}, Name: {hits.entities[i].get('name')}")
断开连接
# 断开与 Milvus 服务的连接
connections.disconnect("default")
通过以上详细的输入输出参数说明和代码示例,你可以在 Milvus 向量数据库中完成保存、删除、查询等操作。