跳到主要内容
版本:v2.4.x

管理 Collection

本指南将指导您使用所选的 SDK 创建和管理 Collection。

开始之前

概述

在 Milvus 中,您可以将 Embedding 存储在 Collection 中。一个 Collection 中的所有 Embedding 都具有相同的维度和距离度量相似性。

Milvus Collection 支持动态字段(即 Schema 中未预定义的字段)和 AutoID(自动生成主键)。

为了适应不同的偏好,Milvus 提供了两种创建 Collection 的方法。其中一种提供快速设置,其他则允许对 Collection Schema 和索引参数进行详细定制。

此外,您还可以在必要时查看、加载、释放和删除 Collection。

创建 Collection

您可以通过以下任一方式创建 Collection:

  • 快速设置

在这种方式下,只需给 Collection 命名并指定要存储在此 Collection 中的 Embedding 的维数,即可创建 Collection。详情请参阅 快速设置

  • 自定义设置

与让 In Milvus 为你的 Collection 决定几乎所有事情不同,你可以自己决定 Collection 的 Schema索引参数。详情请参阅 自定义设置

快速设置

在人工智能行业大跃进的背景下,大多数开发人员只需要一个简单而又充满活力的 Collection 就可以开始使用了。Milvus 只需三个参数就能快速设置这样的 Collection:

  • 要创建的 Collection 名称、

  • 要插入的向量 Embedding 的维度,以及

  • 用于衡量 Embedding 之间相似性的度量类型。

为了快速设置,请使用 create_collection() 方法 MilvusClient 类的方法创建一个具有指定名称和维度的 Collection。

Python
from pymilvus import MilvusClient, DataType

# 1. Set up a Milvus client
client = MilvusClient(
uri="http://localhost:19530"
)

# 2. Create a collection in quick setup mode
client.create_collection(
collection_name="quick_setup",
dimension=5
)

res = client.get_load_state(
collection_name="quick_setup"
)

print(res)

# Output
#
# {
# "state": "<LoadState: Loaded>"
# }

上述代码生成的 Collection 只包含两个字段:id (作为主键)和 vector (作为向量字段),默认情况下启用 auto_idenable_dynamic_field 设置。

  • auto_id

启用该设置可确保 Milvus 自动生成主键值。数据插入时无需手动提供主键。

  • enable_dynamic_field

启用后,待插入数据中除 idvector 以外的所有字段都会被视为动态字段。这些附加字段以键值对的形式保存在一个名为 $meta 的特殊字段中。此功能允许在插入数据时包含额外字段。

从提供的代码中自动索引和加载的 Collection 可以立即插入数据。

自定义设置

与其让 Milvus 为你的 Collection 决定几乎一切,你可以自己决定 Collection 的 Schema索引参数

第一步:设置 Schema

Schema 定义了 Collection 的结构。在 Schema 中,您可以选择启用或禁用 enable_dynamic_field、添加预定义字段以及为每个字段设置属性。有关概念和可用数据类型的详细解释,请参阅 Schema Explained

要设置模式,请使用 create_schema() 创建模式对象,并使用 add_field() 为模式添加字段。

Python
# 3. Create a collection in customized setup mode

# 3.1. Create schema
schema = MilvusClient.create_schema(
auto_id=False,
enable_dynamic_field=True,
)

# 3.2. Add fields to schema
schema.add_field(field_name="my_id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="my_vector", datatype=DataType.FLOAT_VECTOR, dim=5)
参数参数
auto_id确定是否启用 AutoID。
设置为 true 时,Milvus 将自动生成主键值。在这种情况下,主键字段不应包含在要插入的数据中,以免出错。自动生成的 ID 有固定长度,不能更改。
enable_dynamic_field决定如果插入到目标 Collection 的数据包括未在 Collection Schema 中定义的字段,Milvus 是否将未定义字段的值保存在动态字段中。
设置为 "true"时,Milvus 将创建一个名为 $meta 的字段,用于保存插入数据中的任何未定义字段及其值。
field_name字段的名称。
datatype字段的数据类型。有关可用数据类型的列表,请参阅数据类型
is_primary当前字段是否为 Collection 中的主键字段。
每个 Collection 只有一个主键字段。主键字段应为 DataType.INT64 类型或 DataType.VARCHAR 类型。
dim向量 Embedding 的维数。
对于 DataType.FLOAT_VECTORDataType.BINARY _VECTORDataType .FLOAT16_VECTORDataType.BFLOAT16_VECTOR 类型的字段,这是必填项。如果使用 DataType.SPARSE_FLOAT_VECTOR,请省略此参数。

第二步:设置索引参数

索引参数决定了 Milvus 如何在 Collection 中组织数据。您可以通过调整 metric_typeindex_type 来定制特定字段的索引过程。对于向量字段,您可以根据所处理的向量类型,灵活选择 COSINE,L2,IP,HAMMINGJACCARD 作为 metric_type。更多信息,请参阅 "相似度指标"

要设置索引参数,请使用 prepare_index_params() 准备索引参数,并使用 add_index() 来添加索引。

Python
# 3.3. Prepare index parameters
index_params = client.prepare_index_params()

# 3.4. Add indexes
index_params.add_index(
field_name="my_id",
index_type="STL_SORT"
)

index_params.add_index(
field_name="my_vector",
index_type="IVF_FLAT",
metric_type="IP",
params={ "nlist": 128 }
)
参数说明
field_name应用此对象的目标文件名称。
index_type用于在特定字段中排列数据的算法名称。有关适用算法,请参阅内存索引磁盘索引
metric_type用于衡量向量间相似性的算法。可能的值有 IPL2COSINEJACCARDHAMMING。只有指定字段为向量字段时才可用。更多信息,请参阅Milvus 支持的索引
params指定索引类型的微调参数。有关可能的键和值范围的详细信息,请参阅内存索引

上面的代码片段演示了如何分别为向量字段和标量字段设置索引参数。对于向量字段,同时设置度量类型和索引类型。对于标量字段,只需设置索引类型。建议为向量字段和任何经常用于筛选的标量字段创建索引。

第 3 步:创建 Collection

你可以选择分别创建 Collection 和索引文件,或者在创建 Collection 时同时加载索引。

使用 create_collection() 以指定的 Schema 和索引参数创建 Collection,并使用 get_load_state() 检查 Collection 的加载状态。

  • 创建 Collection 时同时加载索引
Python
# 3.5. Create a collection with the index loaded simultaneously
client.create_collection(
collection_name="customized_setup_1",
schema=schema,
index_params=index_params
)

time.sleep(5)

res = client.get_load_state(
collection_name="customized_setup_1"
)

print(res)

# Output
#
# {
# "state": "<LoadState: Loaded>"
# }

上面创建的 Collection 会自动加载。要了解加载和释放 Collection 的更多信息,请参阅加载和 释放 Collection

  • 分别创建 Collection 和索引文件
Python
# 3.6. Create a collection and index it separately
client.create_collection(
collection_name="customized_setup_2",
schema=schema,
)

res = client.get_load_state(
collection_name="customized_setup_2"
)

print(res)

# Output
#
# {
# "state": "<LoadState: NotLoad>"
# }

上面创建的 Collection 不会自动加载。您可以按如下方式为 Collection 创建索引。以单独的方式为 Collection 创建索引不会自动加载 Collection。有关详细信息,请参阅 加载和释放 Collection

参数说明
collection_nameCollection 的名称。
schema此 Collection 的 Schema。
设置为 "无 " 表示将使用默认设置创建此 Collection。
要使用自定义 Schema 设置 Collection,需要创建一个 CollectionSchema 对象并在此处引用它。在这种情况下,Milvus 会忽略请求中携带的所有其他 Schema 相关设置。
index_params在此 Collection 中建立向量字段索引的参数。要使用自定义 Schema 设置 Collection 并自动将 Collection 加载到内存中,需要创建一个 IndexParams 对象并在此处引用。
至少应为此 Collection 中的向量字段添加一个索引。如果希望稍后再设置索引参数,也可以跳过此参数。

上面创建的 Collection 不会自动加载。你可以按以下方法为 Collection 创建索引。以单独方式为 Collection 创建索引不会自动加载 Collection。有关详细信息,请参阅 加载和释放 Collection

Python
# 3.6 Create index
client.create_index(
collection_name="customized_setup_2",
index_params=index_params
)

res = client.get_load_state(
collection_name="customized_setup_2"
)

print(res)

# Output
#
# {
# "state": "<LoadState: NotLoad>"
# }
参数说明
collection_nameCollection 的名称。
index_paramsIndexParams 对象,包含一个 IndexParam 对象列表。

查看 Collection

要查看现有 Collection 的详细信息,请使用 describe_collection()

Python
# 5. View Collections
res = client.describe_collection(
collection_name="customized_setup_2"
)

print(res)

# Output
#
# {
# "collection_name": "customized_setup_2",
# "auto_id": false,
# "num_shards": 1,
# "description": "",
# "fields": [
# {
# "field_id": 100,
# "name": "my_id",
# "description": "",
# "type": 5,
# "params": {},
# "element_type": 0,
# "is_primary": true
# },
# {
# "field_id": 101,
# "name": "my_vector",
# "description": "",
# "type": 101,
# "params": {
# "dim": 5
# },
# "element_type": 0
# }
# ],
# "aliases": [],
# "collection_id": 448143479230158446,
# "consistency_level": 2,
# "properties": {},
# "num_partitions": 1,
# "enable_dynamic_field": true
# }

要列出所有现有的 Collection,可以按以下方式操作:

Python
# 6. List all collection names
res = client.list_collections()

print(res)

# Output
#
# [
# "customized_setup_2",
# "quick_setup",
# "customized_setup_1"
# ]

加载和释放 Collection

在加载 Collection 的过程中,Milvus 会将 Collection 的索引文件加载到内存中。相反,在释放 Collection 时,Milvus 会从内存中卸载索引文件。在某个 Collection 中进行搜索之前,请确保该 Collection 已加载。

加载 Collection

要加载一个 Collection,请使用 load_collection() 方法,指定 Collection 名称。还可以设置 replica_number,以确定加载 Collection 时在查询节点上创建多少个数据段 In-Memory Replica。

  • Milvus Standalone:replica_number 的最大允许值为 1。
  • Milvus 集群:最大值不应超过 Milvus 配置中设置的 queryNode.replicas。有关其他详细信息,请参阅 查询节点相关配置
Python
# 7. Load the collection
client.load_collection(
collection_name="customized_setup_2",
replica_number=1 # Number of replicas to create on query nodes. Max value is 1 for Milvus Standalone, and no greater than `queryNode.replicas` for Milvus Cluster.
)

res = client.get_load_state(
collection_name="customized_setup_2"
)

print(res)

# Output
#
# {
# "state": "<LoadState: Loaded>"
# }

部分加载 Collection(公开预览版)

说明

此功能目前处于公开预览阶段。API 和功能将来可能会更改。

收到加载请求后,Milvus 会将所有向量字段索引和所有标量字段数据加载到内存中。如果某些字段不参与搜索和查询,您可以将其排除在加载之外,以减少内存使用,提高搜索性能。

Python
# 7. Load the collection
client.load_collection(
collection_name="customized_setup_2",
load_fields=["my_id", "my_vector"], # Load only the specified fields
skip_load_dynamic_field=True # Skip loading the dynamic field
)

res = client.get_load_state(
collection_name="customized_setup_2"
)

print(res)

# Output
#
# {
# "state": "<LoadState: Loaded>"
# }

请注意,只有 load_fields 中列出的字段才能用作搜索和查询的筛选条件和输出字段。在列表中应始终包含主键。不加载的字段名将不能用于筛选或输出。

可以使用 skip_load_dynamic_field=True 跳过加载动态字段。Milvus 将动态字段视为单个字段,因此动态字段中的所有键将一起被包含或排除。

释放 Collection

要释放一个 Collection,请使用 release_collection() 方法,并指定 Collection 名称。

Python
# 8. Release the collection
client.release_collection(
collection_name="customized_setup_2"
)

res = client.get_load_state(
collection_name="customized_setup_2"
)

print(res)

# Output
#
# {
# "state": "<LoadState: NotLoad>"
# }

设置 Alias

您可以为 Collection 指定别名,使它们在特定上下文中更有意义。您可以为一个 Collection 指定多个别名,但多个 Collection 不能共享一个别名。

创建 Alias

要创建别名,请使用 create_alias() 方法,指定 Collection 名称和别名。

Python
# 9.1. Create aliases
client.create_alias(
collection_name="customized_setup_2",
alias="bob"
)

client.create_alias(
collection_name="customized_setup_2",
alias="alice"
)
参数说明
collection_name要创建别名的 Collection 名称。
aliasCollection 的别名。操作前,请确保别名不存在。如果已经存在,则会出现异常。

列出 Alias

要列出别名,请使用 list_aliases() 方法,并指定 Collection 名称。

Python
# 9.2. List aliases
res = client.list_aliases(
collection_name="customized_setup_2"
)

print(res)

# Output
#
# {
# "aliases": [
# "bob",
# "alice"
# ],
# "collection_name": "customized_setup_2",
# "db_name": "default"
# }

描述 Alias

要描述别名,请使用 describe_alias() 方法指定别名。

Python
# 9.3. Describe aliases
res = client.describe_alias(
alias="bob"
)

print(res)

# Output
#
# {
# "alias": "bob",
# "collection_name": "customized_setup_2",
# "db_name": "default"
# }

重新指定 Alias

要将别名重新分配给其他 Collection,请使用 alter_alias() 方法,指定 Collection 名称和别名。

Python
# 9.4 Reassign aliases to other collections
client.alter_alias(
collection_name="customized_setup_1",
alias="alice"
)

res = client.list_aliases(
collection_name="customized_setup_1"
)

print(res)

# Output
#
# {
# "aliases": [
# "alice"
# ],
# "collection_name": "customized_setup_1",
# "db_name": "default"
# }

res = client.list_aliases(
collection_name="customized_setup_2"
)

print(res)

# Output
#
# {
# "aliases": [
# "bob"
# ],
# "collection_name": "customized_setup_2",
# "db_name": "default"
# }

删除 Alias

要删除别名,请使用 drop_alias() 方法指定别名。

Python
# 9.5 Drop aliases
client.drop_alias(
alias="bob"
)

client.drop_alias(
alias="alice"
)
Shell
curl -X POST "http://${MILVUS_URI}/v2/vectordb/aliases/drop" \
-H "Content-Type: application/json" \
-d '{
"aliasName": "bob"
}'

# {
# "code": 0,
# "data": {}
# }

curl -X POST "http://${MILVUS_URI}/v2/vectordb/aliases/drop" \
-H "Content-Type: application/json" \
-d '{
"aliasName": "alice"
}'

# {
# "code": 0,
# "data": {}
# }

设置属性

可以为 Collection 设置属性,如 ttl.secondsmmap.enabled。更多信息,请参阅 set_properties()

说明

本节中的代码片段使用 PyMilvus ORM 模块 与 Milvus 进行交互。使用新的 MilvusClient SDK 的代码片段即将发布。

设置 TTL

为 Collection 中的数据设置 Time-to-Live(TTL),指定数据在自动删除前应保留多长时间。

Python
from pymilvus import Collection, connections

# Connect to Milvus server
connections.connect(host="localhost", port="19530") # Change to your Milvus server IP and port

# Get existing collection
collection = Collection("quick_setup")

# Set the TTL for the data in the collection
collection.set_properties(
properties={
"collection.ttl.seconds": 60
}
)

设置 MMAP

为 Collection 配置内存映射 (MMAP) 属性,该属性决定数据是否映射到内存中以提高查询性能。有关详细信息,请参阅 配置内存映射

说明

在设置 MMAP 属性之前,请先释放 Collection。否则会出错。

Python
from pymilvus import Collection, connections

# Connect to Milvus server
connections.connect(host="localhost", port="19530") # Change to your Milvus server IP and port

# Get existing collection
collection = Collection("quick_setup")

# Before setting memory mapping property, we need to release the collection first.
collection.release()

# Set memory mapping property to True or Flase
collection.set_properties(
properties={
"mmap.enabled": True
}
)

删除 Collection

如果不再需要某个 Collection,您可以放弃该 Collection。

要删除一个 Collection,请使用 drop_collection() 方法,并指定 Collection 名称。

Python
# 10. Drop the collections
client.drop_collection(
collection_name="quick_setup"
)

client.drop_collection(
collection_name="customized_setup_1"
)

client.drop_collection(
collection_name="customized_setup_2"
)