跳到主要内容

使用 MilvusClient

本页介绍如何使用 Pymilvus 中的 MilvusClient。MilvusClient 是 Pymilvus 的简化包装器,更易于使用,隐藏了使用原始 SDK 时的大部分复杂性。

确保 Milvus 正在运行。

MilvusClient 支持通过 URI 连接到服务的统一方式。以下是一些有效 URI 的示例:

  1. "http://localhost:19530"
  2. "https://user:password@mysite:19530"
  3. "https://username:password@in01-12a.aws-us-west-2.vectordb.zillizcloud.com:19538"

使用 HTTPS 连接时,我们需要用户名和密码。

现在让我们通过一个使用 MilvusClient 的快速示例来了解它。

基础知识

创建 Client

使用 Client 所需的大部分信息都在构造调用中提供。Client 有两个主要用例:创建新的 Milvus collection 或使用之前创建的 collection。

如果创建新的 collection,您必须指定 vector_field 名称,因为这无法从插入的数据中解析。如果您想手动处理此 collection 的 primary field 键,那么您还必须指定 pk_field,否则将使用自动生成的 int field。如果 Milvus 实例中存在同名的 collection,则必须将 overwrite 设置为 True 以删除之前的 collection。

如果您想连接到之前创建的 collection,则只需要提供 uri 和 collection_name,其余信息将从 collection 本身推断出来。

from pymilvus import MilvusClient

client = MilvusClient(
collection_name="qux",
uri="http://localhost:19530",
vector_field="float_vector",
# pk_field= "id", # If you wanted to provide your own PK
overwrite=True,
)

插入数据

创建 MilvusClient 后,我们可以开始插入数据。数据以字典列表的形式插入,其中每个字典对应 collection 中的一行。每个字典必须包含 collection 中所有列的值,否则插入将抛出异常。

如果 client 是在不存在的 collection 上创建的,或者 overwrite 设置为 True,则字典列表中的第一个条目将用于构造 collection 的 schema。所有后续插入都需要包含与第一个字典相同的 field。如果在构造时没有提供 index 参数,则将使用默认的 HNSW index 来索引数据。

data = [
{
"float_vector": [1,2,3],
"id": 1,
"text": "foo"
},
{
"float_vector": [4,5,6],
"id": 2,
"text": "bar"
},
{
"float_vector": [7,8,9],
"id": 3,
"text": "baz"
}
]
client.insert_data(data)

搜索数据

一旦数据插入到 Milvus 中,我们就可以继续搜索 collection。搜索接受搜索向量和我们想要的搜索结果数量 (top_k)。除此之外,如果您愿意,还可以提供搜索参数。搜索参数应该对应于您在构造时提供的 index_parameters。如果没有提供,MilvusClient 将使用默认搜索参数。

res = client.search_data(
data = [[1,3,5], [7,8,9]],
top_k = 2,
)
# [[
# {'data': {'id': 1, 'internal_pk_4537': 441340318978146436, 'text': 'foo'}, 'score': 5.0},
# {'data': {'id': 2, 'internal_pk_4537': 441340318978146437, 'text': 'bar'}, 'score': 14.0}
# ],
# [
# {'data': {'id': 3, 'internal_pk_4537': 441340318978146438, 'text': 'baz'}, 'score': 0.0},
# {'data': {'id': 2, 'internal_pk_4537': 441340318978146437, 'text': 'bar'}, 'score': 27.0}
# ]]

搜索结果将以列表的列表形式返回。对于每个搜索向量,您将收到一个字典列表,每个字典包含距离和相应的结果数据。如果不需要所有数据,您可以使用 return_fields 参数调整返回的数据。

高级功能

Partition

MilvusClient 在当前版本中支持 partition。可以在 MilvusClient 构造时和之后指定 partition。以下是使用 partition 功能的快速示例。

from pymilvus import MilvusClient


client = MilvusClient(
collection_name="qux",
uri="http://localhost:19530",
vector_field="float_vector",
partitions = ["zaz"],
overwrite=True,
)

data = [
{
"float_vector": [1,2,3],
"id": 1,
"text": "foo"
},
]
client.insert_data(data, partition="zaz")

client.add_partitions(["zoo"])

data = [
{
"float_vector": [4,5,6],
"id": 2,
"text": "bar"
},
]
client.insert_data(data, partition="zoo")

res = client.search_data(
data = [1,3,5],
top_k = 2,
)

# [[
# {'data': {'id': 1, 'internal_pk_3bd4': 441363276234227849, 'text': 'foo'}, 'score': 5.0},
# {'data': {'id': 2, 'internal_pk_3bd4': 441363276234227866, 'text': 'bar'}, 'score': 14.0}
# ]]


res = client.search_data(
data = [1,3,5],
top_k = 2,
partitions=["zaz"]
)

# [[
# {'data': {'id': 1, 'internal_pk_3bd4': 441363276234227849, 'text': 'foo'}, 'score': 5.0}
# ]]

res = client.search_data(
data = [1,3,5],
top_k = 2,
partitions=["zoo"]
)

# [[
# {'data': {'id': 2, 'internal_pk_3bd4': 441363276234227866, 'text': 'bar'}, 'score': 14.0}
# ]]

过滤

过滤可用于缩小结果范围以匹配元数据或基于元数据查询数据。

from pymilvus import MilvusClient

client = MilvusClient(
collection_name="qux",
uri="http://localhost:19530",
vector_field="float_vector",
# pk_field= "id", # If you wanted to provide your own PK
overwrite=True,
)

data = [
{
"float_vector": [1,2,3],
"id": 1,
"text": "foo"
},
{
"float_vector": [4,5,6],
"id": 2,
"text": "bar"
},
{
"float_vector": [7,8,9],
"id": 3,
"text": "baz"
}
]
client.insert_data(data)

res = client.search_data(
data = [1,3,5],
top_k = 2,
filter_expression = "id > 1"
)

# [[
# {'score': 14.0, 'data': {'id': 2, 'text': 'bar', 'internal_pk_5465': 441363276234227922}},
# {'score': 77.0, 'data': {'id': 3, 'text': 'baz', 'internal_pk_5465': 441363276234227923}}
# ]]

res = client.query_data(
filter_expression = "id == 1"
)

# [
# {'id': 1, 'text': 'foo', 'internal_pk_5465': 441363276234227921}
# ]

向量检索和删除

作为向量数据库,我们能够返回实际的向量并删除它们的条目。为了执行这两个功能,我们需要首先获取与我们试图操作的条目对应的 pk。以下是一个示例。

from pymilvus import MilvusClient

client = MilvusClient(
collection_name="qux",
uri="http://localhost:19530",
vector_field="float_vector",
pk_field= "text",
overwrite=True,
)

data = [
{
"float_vector": [1,2,3],
"id": 1,
"text": "foo"
},
{
"float_vector": [4,5,6],
"id": 2,
"text": "bar"
},
{
"float_vector": [7,8,9],
"id": 3,
"text": "baz"
}
]

client.insert_data(data)

res = client.query_data(
filter_expression = "id == 1"
)

# [
# {'id': 1, 'text': 'foo'}
# ]

res = client.get_vectors_by_pk(pks = res[0]["text"])

# [
# {'float_vector': [1.0, 2.0, 3.0], 'text': 'foo'}
# ]

client.delete_by_pk(pks = res[0]["text"])

res = client.query_data(
filter_expression = "id == 1"
)

# []