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

创建 Collection

您可以通过定义 Schema、索引参数、度量类型以及创建时是否加载来创建一个 Collection。本页将介绍如何从头开始创建 Collection。

Collection 概述

Collection 是一个二维表,具有固定的列和变化的行。每列代表一个字段,每行代表一个实体。要实现这样的结构化数据管理,需要一个 Schema。要插入的每个实体都必须符合 Schema 中定义的约束条件。

你可以确定 Collection 的方方面面,包括其 Schema、索引参数、度量类型,以及是否在创建时加载,以确保 Collection 完全满足你的要求。

要创建一个 Collection,您需要

创建 Schema

Schema 定义了 Collection 的数据结构。创建 Collection 时,需要根据自己的要求设计模式。有关详细信息,请参阅Schema Explained

以下代码片段创建了一个模式,其中包含启用的 Dynamic Field 和三个必填字段,分别命名为my_idmy_vectormy_varchar

说明

您可以为任何标量字段设置默认值,并使其可归零。有关详情,请参阅Nullable & Default

# 3. Create a collection in customized setup mode
from pymilvus import MilvusClient, DataType

client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)

# 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)
schema.add_field(field_name="my_varchar", datatype=DataType.VARCHAR, max_length=512)

(可选)设置索引参数

在特定字段上创建索引可加快对该字段的搜索。索引记录了 Collection 中实体的顺序。如以下代码片段所示,您可以使用metric_typeindex_type 为 Milvus 选择适当的方式为字段建立索引,并测量 Embedding 之间的相似性。

在 Milvus 上,您可以使用AUTOINDEX 作为所有向量字段的索引类型,并根据需要使用COSINEL2IP 中的一种作为度量类型。

如上述代码片段所示,您需要为向量字段同时设置索引类型和度量类型,而只需为标量字段设置索引类型。索引对于向量字段是强制性的,建议您在筛选条件中经常使用的标量字段上创建索引。

有关详情,请参阅索引向量 字段索引标量字段

# 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="AUTOINDEX"
)

index_params.add_index(
field_name="my_vector",
index_type="AUTOINDEX",
metric_type="COSINE"
)

创建 Collection

如果创建了带有索引参数的 Collection,Milvus 会在创建时自动加载该 Collection。在这种情况下,索引参数中提到的所有字段都会被索引。

以下代码片段演示了如何创建带索引参数的 Collection 并检查其加载状态。

# 3.5. Create a collection with the index loaded simultaneously
client.create_collection(
collection_name="customized_setup_1",
schema=schema,
index_params=index_params
)

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

print(res)

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

您也可以创建不带任何索引参数的 Collection,然后再添加索引参数。在这种情况下,Milvus 不会在创建时加载 Collection。.

下面的代码片段演示了如何创建一个不带索引的 Collection,创建时 Collection 的加载状态仍为未加载。

# 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 的水平切片。每个 Partition 对应一个数据输入通道。每个 Collection 默认都有一个 Partition。创建 Collection 时,可根据预期吞吐量和要插入 Collection 的数据量设置适当的分片数。

在常见情况下,每当预期吞吐量增加 500 MB/秒或要插入的数据量增加 100 GB 时,就可以考虑增加一个 Partition。这一建议是基于我们自己的经验,可能并不完全适合您的应用场景。你可以根据自己的需要调整这个数字,或者直接使用默认值。

下面的代码片段演示了如何在创建 Collection 时设置分片数。

# With shard number
client.create_collection(
collection_name="customized_setup_3",
schema=schema,
num_shards=1
)

启用 mmap

Milvus 默认在所有 Collection 上启用 mmap,允许 Milvus 将原始字段数据映射到内存中,而不是完全加载它们。这样可以减少内存占用,提高 Collection 的容量。有关 mmap 的详细信息,请参阅使用 mmap

# With mmap
client.create_collection(
collection_name="customized_setup_4",
schema=schema,
enable_mmap=False
)

设置 Collection TTL

如果需要在特定时间段内删除 Collection 中的数据,可以考虑以秒为单位设置其 Time-To-Live (TTL)。一旦 TTL 超时,Milvus 就会删除 Collection 中的实体。删除是异步的,这表明在删除完成之前,搜索和查询仍然可以进行。

下面的代码片段将 TTL 设置为一天(86400 秒)。建议至少将 TTL 设置为几天。

# With TTL
client.create_collection(
collection_name="customized_setup_5",
schema=schema,
properties={
"collection.ttl.seconds": 86400
}
)

设置一致性级别

创建 Collection 时,可以为 Collection 中的搜索和查询设置一致性级别。您还可以在特定搜索或查询过程中更改 Collection 的一致性级别。

# With consistency level
client.create_collection(
collection_name="customized_setup_6",
schema=schema,
# highlight-next
consistency_level="Bounded",
)

有关一致性级别的更多信息,请参阅一致性级别。

启用动态字段

Collection 中的动态字段是一个保留的 JavaScript Object Notation (JSON) 字段,名为**$meta**。启用该字段后,Milvus 会将每个实体中携带的所有非 Schema 定义字段及其值作为键值对保存在保留字段中。

有关如何使用动态字段的详细信息,请参阅动态字段