在上一章中,我们介绍了 Milvus 的几种部署方式。现在可以进入实践部分:如何有效地与 Milvus 交互。
本章将带你了解 Milvus 的基本概念,包括 collections、schemas、fields 和 indexes。我们还会解释使用 Milvus 的基本工作流,你可以通过 Python SDK 实现这些操作。此外,我们还将介绍一种更轻量的 Milvus 访问方式:内置 REST 服务。
因此,本章主要覆盖以下三个主题:
- 介绍 Milvus 的核心对象
- 通过 Python SDK 与 Milvus 交互
- 通过 REST APIs 与 Milvus 交互
技术要求
本章使用的代码可以在我们的 GitHub 仓库中找到:
https://github.com/PacktPublishing/The-Architecture-Handbook-for-Milvus-Vector-Database
介绍 Milvus 的核心对象
本节将介绍 Milvus 中的一些基本概念。理解这些概念对于使用 Milvus 至关重要,并且它们在真实业务场景中发挥关键作用。我们将覆盖的核心概念包括 collections、schemas、fields 和 indexes。
下面是每个概念的简要说明:
- collection 相当于关系型数据库中的 table。作为 Milvus 中的顶层数据容器,它存储逻辑上相关的数据。
- schema 是 collection 的结构定义,由多个 field 的详细数据描述组成。
- field 对应数据结构中的单独一列,定义列名和数据类型等列属性。
- index 是一种辅助数据结构,用于加速数据查询。它可以构建在标量列和向量列之上。
为了帮助你理解,我们将按照自底向上的顺序进行解释。先从 fields 开始。
Fields
Field 是 Milvus 中定义数据属性的基础单元,对应关系型数据库表中的单独一列。它描述 collection 中某一类具体数据的特征,而一个 collection 中所有 fields 的集合,就构成了该 collection 的核心元数据。
要定义一个有效 field,至少必须指定两个必需属性:
- Field name:该 field 在 collection 内的唯一标识符,必须是字符串。
- Field type:该 field 中存储值的数据类型,例如
INT64、VARCHAR或FLOAT_VECTOR,必须显式声明。
根据所选 field type,你可能需要配置额外的类型特定属性,例如 VARCHAR fields 的 max_length,或 FLOAT_VECTOR fields 的 dim。除此之外,你还可以设置可选属性来增强功能,例如将某个 field 标记为 primary key,为 primary key field 启用自增,或将某个 field 指定为 partition key,以优化查询性能。
为了更直观理解 field 的概念,我们使用一个真实世界例子。假设我们创建一个 collection,用于存储电影信息,类似关系型数据库中的 table。我们需要记录每部电影的核心信息,包括全局唯一 movie ID、导演姓名、影片时长,以及从电影海报中提取的 128 维浮点特征向量。为简化起见,该 collection 只包含上述信息;我们可以定义以下对应 fields:
field0 = FieldSchema(name="movie_id", dtype=DataType.INT64,
is_primary=True),
field1 = FieldSchema(name="movie_director", dtype=DataType.VARCHAR,
max_length=64),
field2 = FieldSchema(name="movie_duration", dtype=DataType.DOUBLE),
field3 = FieldSchema(name="movie_picture", dtype=DataType.FLOAT_VECTOR,
dim=128),
下面是对每个 field 定义的详细解释:
- field0:field name 是
movie_id,数据类型为INT64。is_primary=True属性表示该 field 是整个 collection 的 primary key,其值在 collection 中全局唯一,可用于唯一标识每部电影。 - field1:field name 是
movie_director,数据类型为VARCHAR,即可变长字符串。max_length=64将该 field 中存储的导演姓名最大字节长度设置为 64。 - field2:field name 是
movie_duration,数据类型为DOUBLE,用于存储电影时长的数值。 - field3:field name 是
movie_picture,数据类型为FLOAT_VECTOR。dim=128属性表示该 field 存储电影海报 embedding 后生成的 128 维浮点特征向量。
我们给出的 field0 到 field3 定义只是基础示例。Milvus 中的 field 定义支持更广泛的可配置属性,用于精细约束 field 的行为和特征。
下表详细拆解了核心属性:
| Attribute | Description |
|---|---|
| Name | collection 中 field 的唯一名称,字符串,必需。 |
Data type (dtype) | field 的数据类型,例如 INT64、VARCHAR、FLOAT_VECTOR,必需。 |
| Description | 可选字符串,用于解释 field 目的,提高可读性。 |
is_primary | Boolean,默认 false。将该 field 标记为 collection 的 primary key;必须至少定义一个 primary key field,用于唯一标识 entities。 |
auto_id | Boolean,默认 false。仅适用于 primary key fields。为该 field 启用自增值,避免手动指定 primary key 值。 |
is_partition_key | Boolean,默认 false。将该 field 指定为 partition key,类似 enum。Partitions 在存储上物理隔离,因此按 partition key 查询比条件过滤更快。 |
max_length | VARCHAR fields 中字符串值的最大字节长度;对于 VARCHAR 类型是必需属性。 |
Dim | vector-type fields 中向量值的维度,例如 FLOAT_VECTOR;对于所有 vector fields 都是必需属性。 |
表 3.1:Field 属性
定义 field 时,data type 是必需参数,因此我们进一步说明它。
Milvus 支持多样化数据类型,并且不同 field 类别,包括 primary key、scalar 和 vector fields,具有不同的有效数据类型范围。下面按 field 类别拆解支持的数据类型:
Primary key fields
Primary key field 必须满足两个要求:
- 其值必须在整个 collection 中唯一。
- 它可以用于快速定位和检索对应 entities。
并非所有数据类型都可以作为 primary key。目前,Milvus 中只有 INT64 或 VARCHAR 类型的 field 可以定义为 primary key:
- INT64:占用 8 字节内存,表示 64 位整数。
- VARCHAR:存储用户指定最大长度的字符串。
Scalar fields
Scalar fields 用于存储非向量结构化数据,通常是数字、字符串和布尔值等单值数据,而不是高维向量。它们代表 Milvus 中最基本的结构化数据形式。
Scalar fields 支持以下数据类型:
- BOOL:布尔值,
true或false。 - INT8:1 字节整数,表示 8 位有符号整数。
- INT16:2 字节整数,表示 16 位有符号整数。
- INT32:4 字节整数,表示 32 位有符号整数。
- INT64:8 字节整数,表示 64 位有符号整数。
- FLOAT:32 位,即 4 字节浮点数,约 7 位有效精度。
- DOUBLE:64 位,即 8 字节浮点数,约 15–17 位有效精度,高于
FLOAT。 - VARCHAR:可变长字符串,具有用户指定的最大长度。
- JSON:由键值对组成的复合数据类型,其中 key 是字符串,value 可以是数字、字符串、布尔值、数组或嵌套结构。
- Array:同质值的有序集合。
Vector fields
Vector fields 专门用于存储高维向量数据,是 Milvus 面向 AI / ML 和相似性搜索场景的核心数据类型,支持以下向量类型:
- BINARY_VECTOR:存储由 0 和 1 序列表示的二进制向量,适合二进制相似性匹配。
- FLOAT_VECTOR:存储 32 位单精度浮点向量,是通用相似性搜索中最常用的向量类型。
- FLOAT16_VECTOR:存储 16 位半精度浮点向量,在精度和内存效率之间取得平衡。
- BFLOAT16_VECTOR:存储 16 位浮点向量,精度降低,但指数范围与
FLOAT32相同,针对神经网络 embeddings 等 AI / ML 工作负载优化。 - SPARSE_FLOAT_VECTOR:以非零元素及其对应索引的列表形式存储稀疏向量,非常适合表示文本 embeddings 等稀疏数据。
现在我们已经覆盖了 fields 的定义及其支持的数据类型,接下来可以转向 schemas。Schemas 是把这些 fields 组织成 collection 统一结构定义的关键组件。
Schemas
在大多数数据系统中,有效的数据管理依赖清晰规则,用于组织数据集中的数据。例如,Excel 电子表格使用第一行定义列头,指定每列保存的数据类型;传统关系型数据库在创建表时,也要求显式定义列及其属性,例如数据类型或可空约束。
在 Milvus 中,collection schema 是 collection 的正式结构蓝图。简单来说,schema 是一个 collection 中所有 field 定义的结构化组合,再加上一小组 collection-level 配置属性,例如 description,用于治理数据组织方式。基于上一节对 fields 的详细讨论,我们来看如何为 Milvus collection 定义 schema。注意,下面代码中的 fields 变量引用前面已经介绍的 field 定义,为简洁起见这里不再重复定义。代码也展示了 schema 除了 field 列表外,还支持 description 等可配置属性:
fields = [field0, field1, field2, field3]
schema = CollectionSchema(
fields,
description="movie info",
)
鉴于 Milvus 的核心定位是 vector-native database,即专为管理高维向量数据而设计的数据库,collection schema 定义有一条关键规则:每个 Milvus collection schema 必须包含至少一个 vector field,例如 FLOAT_VECTOR 或 BINARY_VECTOR。这是 Milvus schema 与传统关系型数据库 schema 的根本区别,后者只关注 scalar data。
在深入理解 fields,即单个数据列,和 schemas,即数据结构蓝图之后,我们现在可以探索 collections。Collections 是 Milvus 中存储数据的顶层容器。
Collection
在 Milvus 中,collection 是用户管理数据的基本单元。我们可以创建多个 collections,向其中插入数据,并在其上执行检索或其他操作。基于我们对 fields 和 schemas 的理解,即单个数据列和数据结构蓝图,collection 的含义就很清楚了:它相当于 Milvus 中传统关系型数据库的 table,其中 table 中每一行对应 Milvus 中的一个 entity,即一条数据记录。
基于前面一直使用的电影示例,我们定义了电影数据 fields,并为其创建了 schema,现在就可以轻松创建一个 movie collection,如下面代码所示:
milvus_client = MilvusClient("http://localhost:19530")
milvus_client.create_collection(
collection_name="movie", dimension=128, schema=schema)
上面的代码使用预定义 schema 和一个 128 维 vector field 创建了 "movie" collection。
Index
Index 是构建在 collection 中特定列,也就是 fields 之上的可选额外专用数据结构。原始 fields 只存储原始数据,而 index 会利用专用算法和优化过的数据结构,大幅降低数据检索所需时间。这种优化既可以应用于 scalar fields,也可以应用于 vector fields:scalar indexes 可以加速对 movie IDs 或 release years 等 fields 的过滤;而 vector indexes,Milvus 的标志性能力,则支持对高维向量数据进行快速相似性搜索,例如 movie embeddings。虽然创建或使用 collection 并不强制要求 indexes,但它们对实现高性能查询至关重要,尤其是在大规模数据集上。
关于 vector indexes 的更多细节,可以参考第 10 章。
有了这些基础概念之后,我们现在将探索如何在实践中操作并与 Milvus 交互。
通过 Python SDK 与 Milvus 交互
对于任何数据库来说,最关键能力都是数据查询;而对于 Milvus 这个 vector-native database 来说,它的核心优势在于高效查询向量数据。下面几节将带你完成一个端到端数据操作工作流,展示如何使用 Python SDK 与 Milvus 交互,并实现高性能向量数据查询。
在与 Milvus 交互之前,我们需要完成两个准备步骤:
- 在本地启动 Milvus 服务。正如第 2 章所讨论的,启动 Milvus 服务有多种方式;例如,我们可以使用 Docker Compose 在本地机器上启动 standalone Milvus 服务。
- 在本地安装 PyMilvus SDK,即 Milvus 官方 Python SDK。可以在终端运行
pip install pymilvus命令完成安装。该命令会自动安装最新稳定版本的 PyMilvus SDK。
随后,我们可以执行端到端数据操作工作流,包括以下步骤:
- 连接到 Milvus
- 创建 collection
- 查看 collections
- 插入数据
- 查询 ID 为 2 的数据
- Upsert ID 为 2 的数据
- 使用过滤条件进行查询
- 删除 entity
- 执行 vector search
- 删除 collection
完整代码可以在 GitHub 仓库中找到:
https://github.com/PacktPublishing/The-Architecture-Handbook-for-Milvus-Vector-Database/blob/main/ch3/hello_milvus.py
让我们开始吧!
Step 1:连接到 Milvus
这两行代码是使用 Python SDK 连接 Milvus 服务的核心操作:
from pymilvus import MilvusClient
milvus_client = MilvusClient("http://localhost:19530")
pymilvus 是 Milvus 官方 Python SDK。第一行从该库中导入 MilvusClient 类;它是 pymilvus 提供的核心客户端工具,所有与 Milvus 的交互,例如创建 collection、插入数据、查询数据、创建 index 等,都必须通过该类实例完成。
第二行实例化 MilvusClient 类,其中 "http://localhost:19530" 是指定的 Milvus 服务连接地址,即 endpoint。当连接 macOS 或 Linux 上的本地 Milvus 实例时,如果不是 Docker 环境,该地址是正确的。19530 是 Milvus 默认固定 HTTP 端口。
Step 2:创建 collection
这段代码用于创建一个 Milvus collection,逻辑直接且容易理解:
collection_name = "hello_milvus"
schema = milvus_client.create_schema()
schema.add_field("id", DataType.INT64, is_primary=True)
schema.add_field("vector", DataType.FLOAT_VECTOR, dim=8)
schema.add_field("score", DataType.INT64)
index_params = milvus_client.prepare_index_params()
index_params.add_index(
field_name = "vector",
Index_type="HNSW",
metric_type="L2"
)
milvus_client.create_collection(
collection_name,
schema=schema,
index_params=index_params,
consistency_level="Strong"
)
这个 collection 由三个 fields 组成:"id" field 的数据类型是 INT64,并作为 collection 的 primary key;"vector" field 是一个 vector column,数据类型为 FLOAT_VECTOR;"score" field 的数据类型同样是 INT64。
如上一节所述,Milvus collection 必须包含一个 primary key field,并且至少包含一个 vector field;上面的 field 定义完全满足这些要求。需要注意的是,这里定义 fields 和 schemas 的语法与前文介绍的略有不同,这是完全正常的,因为 Milvus Python SDK 支持多种语法形式。你可以根据个人偏好选择使用哪一种。
此外,在创建这个 collection 时,我们还指定为 "vector" field 创建 vector index:index type 是 HNSW,距离计算方式是 L2,也就是欧氏距离。关于 vector indexes 的更多细节,可以参考第 10 章。
在上面的示例代码中,调用 create_collection() 方法时指定了一个关键参数:consistency_level="Strong"。该参数用于将 collection 的默认一致性级别设置为 strong consistency,这意味着所有写入 collection 的数据都会实时同步,并且后续任何查询操作都能读取到最新写入结果。如果你想进一步了解 consistency levels,可以参考官方文档中的详细解释:
https://milvus.io/docs/consistency.md#Set-Consistency-Level-upon-Creating-Collection
Step 3:查看 collections
创建 collection 后,我们可以使用 SDK 提供的 list_collections() 方法验证 collection 是否创建成功,也可以使用 describe_collection() 方法检查 collection 的数据结构,包括 fields、indexes、data types 等,是否与创建时指定的定义一致。
print(fmt.format(" all collections "))
print(milvus_client.list_collections())
print(fmt.format(f"schema of collection {collection_name}"))
print(milvus_client.describe_collection(collection_name))
下面是输出:
=== all collections ===
['hello_milvus']
=== schema of collection hello_milvus ===
{'collection_name': 'hello_milvus', 'auto_id': False, 'num_shards': 1, 'description': '', 'fields': [{'field_id': 100, 'name': 'id', 'description': '', 'type': <DataType.INT64: 5>, 'params': {}, 'is_primary': True}, {'field_id': 101, 'name': 'vector', 'description': '', 'type': <DataType.FLOAT_VECTOR: 101>, 'params': {'dim': 8}}, {'field_id': 102, 'name': 'score', 'description': '', 'type': <DataType.INT64: 5>, 'params': {}}], 'functions': [], 'aliases': [], 'collection_id': 464678310267870512, 'consistency_level': 0, 'properties': {'timezone': 'UTC'}, 'num_partitions': 1, 'enable_dynamic_field': False, 'created_timestamp': 464792252544450578, 'update_timestamp': 464792252544450578}
从 list_collections() 的输出可以看到,hello_milvus collection 已成功创建。
从 describe_collection() 的结果可以验证,collection 的 field structure 与 create_collection() 中定义的 field schema 一致。
除了 field schema 信息,describe_collection() 还会返回额外配置细节,例如 consistency_level、num_partitions 和 enable_dynamic_field。这些都是可以在创建 collection 时指定的可配置参数。由于本示例没有显式设置它们,SDK 自动应用了默认值。
这里不逐一解释这些参数;感兴趣的读者可以参考 Milvus 官方文档。
Step 4:插入数据
成功创建 collection 后,我们可以向其中插入数据。下面代码向目标 collection 插入六条 entity data,核心要求是每条数据记录的结构必须与 collection 的 schema 定义一致:
rng = np.random.default_rng(seed=42)
rows = [
{"id": 1, "vector": rng.random((1, dim))[0], "score": 100},
{"id": 2, "vector": rng.random((1, dim))[0], "score": 200},
{"id": 3, "vector": rng.random((1, dim))[0], "score": 300},
{"id": 4, "vector": rng.random((1, dim))[0], "score": 400},
{"id": 5, "vector": rng.random((1, dim))[0], "score": 500},
{"id": 6, "vector": rng.random((1, dim))[0], "score": 600},
]
print(fmt.format("Start inserting entities"))
insert_result = milvus_client.insert(
collection_name, rows, progress_bar=True)
print(fmt.format("Inserting entities done"))
print(insert_result)
下面是输出:
=== Start inserting entities ===
=== Inserting entities done ===
{'insert_count': 6, 'ids': [1, 2, 3, 4, 5, 6]}
成功插入后,Milvus 会返回一个插入结果对象,其中包含关键信息:成功插入的总条数,以及插入数据对应的 primary key ID 列表。在上面的示例中,我们打印了该结果对象,以展示数据已经成功插入。
Step 5:查询 ID 为 2 的数据
query 是 Milvus Python SDK 中最常用的接口之一,用于从 collection 中检索原始数据。在这个示例中,我们指定 primary key value(ids=[2])来精确查询并获取 primary key 值为 2 的 entity data。
print(fmt.format("Start query by specifying primary keys"))
query_results = milvus_client.query(collection_name, ids=[2])
print(query_results[0])
下面是输出:
=== Start query by specifying primary keys ===
{'vector': [0.12811362743377686, 0.4503859281539917, 0.3707980215549469, 0.926764965057373, 0.6438651084899902, 0.822761595249176, 0.44341421127319336, 0.2272387146949768], 'score': 200, 'id': 2}
从上面 query 命令输出可以看到,该命令完整检索了一个 entity 的全部信息,包括 id、score 和 vector 列内容。
Step 6:Upsert ID 为 2 的数据
upsert 是 Milvus Python SDK 中用于数据更新,或插入,的核心接口。如果指定 primary key 的 entity 已经存在,则会更新该 entity 的内容;如果不存在,则插入新的 entity。
本示例中,我们调用 upsert 接口更新 primary key 为 2 的 entity data,修改它的 vector 值和 score 值,然后再次调用 query 接口检索该 primary key 对应的 entity。
upsert_ret = milvus_client.upsert(
collection_name,
{"id": 2, "vector": rng.random((1, dim))[0], "score": 220}
)
print(upsert_ret)
print(fmt.format("Start query by specifying primary keys"))
query_results = milvus_client.query(collection_name, ids=[2])
print(query_results[0])
下面是输出:
{'upsert_count': 1, 'primary_keys': [2]}
=== Start query by specifying primary keys ===
{'score': 220, 'id': 2, 'vector': [0.6824954748153687, 0.13975247740745544, 0.19990819692611694, 0.007362269796431065, 0.7869243621826172, 0.6648508310317993, 0.7051653861999512, 0.7807290554046631]}
可以看到,数据已成功更新。
Step 7:使用过滤条件进行查询
在 Step 5–6 中,我们演示了基于 primary keys 的 query 方法,而本示例展示 Milvus 中另一种常用查询方法:scalar filtering query。
print(fmt.format("Start query by specifying filtering expression"))
query_results = milvus_client.query(
collection_name,
filter="score ==600")
for ret in query_results:
print(ret)
下面是输出:
=== Start query by specifying filtering expression ===
{'id': 6, 'vector': [0.4371519088745117, 0.8326781988143921, 0.700265109539032, 0.31236663460731506, 0.8322597742080688, 0.8047643303871155, 0.38747838139533997, 0.2883281111717224], 'score': 600}
在上面的代码中,我们指定 filter="score == 600" 过滤条件,以筛选并检索 collection 中 score field 值等于 600 的所有 entities。
Step 8:删除 entity
下面代码展示 Milvus Python SDK 中 delete 接口的用法,即通过 primary key 删除指定 entity:
print(f"start to delete by specifying filter in collection {collection_name}")
delete_result = milvus_client.delete(collection_name, ids=[6])
print(delete_result)
print(fmt.format("Start query by specifying filtering expression"))
query_results = milvus_client.query(
collection_name, filter= "score == 600")
assert len(query_results) == 0
下面是输出:
start to delete by specifying filter in collection hello_milvus
{'delete_count': 1}
=== Start query by specifying filtering expression ===
本示例中,我们调用 delete 接口移除 primary key 为 6 的 entity,该 entity 的 score field 值为 600;删除操作完成后,我们再次使用 filter="score == 600" scalar filter condition 查询 collection,并使用 assert 语句验证查询结果为空,从而确认该 entity 已成功删除。
Step 9:执行 vector search
下面代码展示 Milvus 中最基础的 vector similarity search 操作:
rng = np.random.default_rng(43)
vectors_to_search = rng.random((1, dim))
print(fmt.format(f"Start search with retrieve serveral fields."))
result = milvus_client.search(
collection_name,
vectors_to_search,
limit=3,
output_fields=["score"]
)
for hits in result:
for hit in hits:
print(f"hit: {hit}")
下面是输出:
Start search with retrieve several fields.
hit: {'id': 3, 'distance': 1.1954224109649658, 'entity': {'score': 300}}
hit: {'id': 2, 'distance': 1.2375965118408203, 'entity': {'score': 220}}
hit: {'id': 5, 'distance': 1.5500348806381226, 'entity': {'score': 500}}
首先,我们随机生成一个待搜索向量(vectors_to_search),然后在指定 collection 上执行 vector similarity search。我们设置 limit=3,要求返回与待搜索向量最相似的三个 entities,并指定 output_fields=["score"],要求在搜索结果中返回 score field 的值。
Step 10:删除 collection
drop_collection 是 Milvus Python SDK 中用于删除整个 collection 的核心接口。执行该操作后,目标 collection 会被彻底移除,包括 collection 中的所有原始 entity data、vector index data,以及 collection 的 schema metadata。
milvus_client.drop_collection(collection_name)
请注意,该操作不可逆。
通过以上步骤,我们希望你已经基本掌握如何使用 Milvus Python SDK 与 Milvus 交互。完整可运行代码可通过以下链接获取:
https://github.com/PacktPublishing/The-Architecture-Handbook-for-Milvus-Vector-Database/blob/main/ch3/hello_milvus.py
我们通过一系列示例详细说明了如何借助 Milvus Python SDK 完成与 Milvus 的各种核心交互操作。Milvus Python SDK 具备易用和高性能优势,是 Python 开发者连接 Milvus 的首选方案。然而,在实际开发场景中,跨语言、跨系统集成 Milvus 的需求非常常见。因此,下一节会介绍另一种通用交互方式,也就是通过 REST APIs 与 Milvus 交互。
通过 REST APIs 与 Milvus 交互
在某些场景下,我们可能无法访问编程语言环境,例如产品团队成员,或者只是做一两个简单操作时,并不想打开代码编辑器。在这类情况下,常见选择是 REST API,前提是服务暴露了 RESTful endpoints。本节将介绍如何使用 REST API。与 Python SDK 类似,这里不会详细展开每个参数;关于每个 API 的完整使用细节,请参考 Milvus 官方文档:
https://milvus.io/api-reference/restful/v2.6.x/About.md
Step 1:创建 collection
如果查看前面链接的文档,你会发现示例请求中带有 authorization header,主要用于用户名密码验证。默认情况下,Milvus 关闭了这种验证,因此这里不设置该 header:
curl --request POST \
--url "http://localhost:19530/v2/vectordb/collections/create" \
--header "Content-Type: application/json" \
-d '{
"collectionName": "hello_milvus_http",
"dimension": 5
}'
响应应如下:
{"code":0,"data":{}}
Step 2:描述 collection
我们可以通过 REST API 的 describe 接口显示某个 collection 的全部详细信息:
curl --request POST \
--url "http://localhost:19530/v2/vectordb/collections/describe" \
--header "Content-Type: application/json" \
-d '{
"collectionName": "hello_milvus_http" }'
响应应如下:
{"code":0,"data":{"aliases":[],"autoId":false,"collectionID":454786685267084134,"collectionName":"hello_milvus_http","consistencyLevel":"Bounded","description":"","enableDynamicField":true,"fields":[{"autoId":false,"clusteringKey":false,"description":"","id":100,"name":"id","partitionKey":false,"primaryKey":true,"type":"Int64"},{"autoId":false,"clusteringKey":false,"description":"","id":101,"name":"vector","params":[{"key":"dim","value":"5"}],"partitionKey":false,"primaryKey":false,"type":"FloatVector"}],"indexes":[{"fieldName":"vector","indexName":"vector","metricType":"COSINE"}],"load":"LoadStateLoaded","partitionsNum":1,"properties":[],"shardsNum":1},"message":""}
Step 3:列出所有 collections
可以使用以下命令列出所有已创建 collections:
curl --request POST \
--url "http://localhost:19530/v2/vectordb/collections/list" \
--header "Content-Type: application/json" \
-d '{}'
响应应如下:
{"code":0,"data":["hello_milvus_http"]}
Step 4:检查 collection 的 index 信息和 load 状态
Step 1 中的 REST API 会默认创建 index 并加载 collection:
curl --request POST \
--url "http://localhost:19530/v2/vectordb/indexes/describe" \
--header "Content-Type: application/json" \
-d '{
"indexName": "vector",
"collectionName": "hello_milvus_http"
}'
响应应如下:
{"code":0,"data":[{"failReason":"","fieldName":"vector","indexName":"vector","indexState":"Finished","indexType":"AUTOINDEX","indexedRows":0,"metricType":"COSINE","pendingRows":0,"totalRows":0}]}
也可以检查 load 状态:
curl --request POST \
--url "http://localhost:19530/v2/vectordb/collections/get_load_state" \
--header "Content-Type: application/json" \
-d '{
"collectionName": "hello_milvus_http"
}'
响应应如下:
{"code":0,"data":{"loadProgress":100,"loadState":"LoadStateLoaded"},"message":""}
Step 5:执行数据 query 或 search
不建议使用 REST APIs 插入或删除数据,因为这些操作涉及大量 vector inputs,会导致 REST requests 过大且难以阅读。类似问题也适用于 query,因为 query responses 会返回完整 vector column data,可能非常巨大。
例如,我们可以将下面的 Python 语句转换为 REST request:
milvus_client.query(collection_name, ids=[2])
curl --request POST \
--url "http://localhost:19530/v2/vectordb/entities/query" \
--header "Content-Type: application/json" \
-d '{
"collectionName": "hello_milvus",
"filter": "id in [2]",
"outputFields": ["id"],
"limit": 1
}'
响应应如下:
{"code":0,"cost":0,"data":[{"id":2}]}
这里不演示 search request,因为它涉及 vectors,并不太有意义。
Step 6:删除 collection
可以使用 drop REST API 删除 collection:
curl --request POST \
--url "http://localhost:19530/v2/vectordb/collections/drop" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
"collectionName": "hello_milvus_http"
}'
响应应如下:
{"code":0,"data":{}}
一般来说,我们只用 REST APIs 执行简单操作,例如创建 / 删除 indexes、加载 / 释放 collections,或检查 collection 状态。
与 Data Manipulation Language(DML)相关的操作,主要包括插入、删除和 upsert 数据。DML 是 SQL 的一个子集,用于在数据库中插入、更新和删除数据。这类操作很难通过 HTTP requests 实现,因为 request payload 难以构造、可读性差,而且错误也难以排查。因此,我们建议对这类操作使用 SDK。
小结
本章中,我们介绍了 Milvus 的核心实体概念,包括 collections、schemas、fields 和 indexes,以及它们相关的 API 操作。
为了强化这些概念,我们使用 Milvus Python SDK 走过了一个基础实践示例,并对每一步进行了详细拆解。此外,我们探索了 Milvus 的内置 REST APIs,它们支持快速执行 collection 相关查询操作。
到这里,你应该已经对 Milvus 有了整体理解,并初步掌握了它的基本使用方式。下一章中,我们将学习 Milvus 的配置,重点是如何优化其设置,以确保它运行得更高效、更稳定。