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

Schema 概述

Schema 定义了 Collection 的数据结构。在创建一个 Collection 之前,你需要设计出它的 Schema。本页将帮助你理解 Collection Schema,并自行设计一个示例 Schema。

概述

在 Milvus 中,Collection Schema 是关系数据库中一个表的组合,它定义了 Milvus 如何组织 Collection 中的数据。

设计良好的 Schema 至关重要,因为它抽象了数据模型,并决定能否通过搜索实现业务目标。此外,由于插入 Collection 的每一行数据都必须遵循 Schema,因此有助于保持数据的一致性和长期质量。从技术角度来看,定义明确的 Schema 会带来组织良好的列数据存储和更简洁的索引结构,从而提升搜索性能。

一个 Collection Schema 包含一个主键、若干向量字段和若干标量字段。单个 Collection 的向量字段数量上限由 proxy.maxVectorFieldNum 控制,默认值为 4,可配置范围为 [1, 10]。下图说明了如何将文章映射到 Schema 字段列表。

Schema design

搜索系统的数据模型设计包括分析业务需求,并将信息抽象为 Schema 表达的数据模型。例如,搜索一段文本必须通过 "嵌入 "将字面字符串转换为向量并启用向量搜索,从而实现 "索引"。除了这一基本要求外,可能还需要存储出版时间戳和作者等其他属性。有了这些元数据,就可以通过过滤来完善语义搜索,只返回特定日期之后或特定作者发表的文本。您还可以检索这些标量与主文本,以便在应用程序中呈现搜索结果。每个标量都应分配一个唯一标识符,以整数或字符串的形式组织这些文本片段。这些元素对于实现复杂的搜索逻辑至关重要。

请参考 Schema Design Hands-On,了解如何制作一个精心设计的 Schema。

创建 Schema

以下代码片段演示了如何创建模式。

Python
from pymilvus import MilvusClient, DataType

schema = MilvusClient.create_schema()

添加主键字段

Collection 中的主键字段唯一标识一个实体。它只接受 Int64VarChar 值。以下代码片段演示了如何添加主键字段。

Python
schema.add_field(
field_name="my_id",
datatype=DataType.INT64,
is_primary=True,
auto_id=False,
)

添加字段时,可以通过将 is_primary 属性设置为 True 来明确说明该字段是主键字段。主键字段默认接受 Int64 值。在这种情况下,主键字段值应为整数,类似于 12345。如果您选择在主键字段中使用 VarChar 值,则其值应为字符串,类似于 my_entity_1234

您也可以将 autoId 属性设置为 True,使 Milvus 在插入数据时自动分配主键字段值。

详情请参阅 "主键字段和 AutoID"。

添加向量字段

向量字段接受各种稀疏和稠密 Embedding。默认配置下,一个 Collection 最多可添加 4 个向量字段;proxy.maxVectorFieldNum 的可配置范围为 [1, 10],因此该上限最多可调至 10 个。以下代码片段演示了如何添加向量字段。

Python
schema.add_field(
field_name="my_vector",
datatype=DataType.FLOAT_VECTOR,
dim=5
)

上述代码片段中的 dim 参数表示向量字段中要保存的 Embedding 的维数。FLOAT_VECTOR 值表示向量字段持有 32 位浮点数列表,通常用于表示反比例。除此之外,Milvus 还支持以下类型的 Embedding。

  • FLOAT16_VECTOR

这种类型的向量字段持有 16 位半精度浮点数列表,通常适用于内存或带宽受限的深度学习或基于 GPU 的计算场景。

  • BFLOAT16_VECTOR

这种类型的向量字段保存 16 位浮点数列表,精度有所降低,但指数范围与 Float32 相同。这种类型的数据常用于深度学习场景,因为它可以在不明显影响精度的情况下减少内存使用量。

  • BINARY_VECTOR

这种类型的向量字段保存着一个 0 和 1 的列表。它们是图像处理和信息检索场景中表示数据的紧凑特征。

  • SPARSE_FLOAT_VECTOR

这种类型的向量字段可保存非零数字及其序列号列表,用于表示稀疏 Embedding。

添加标量字段

在常见情况下,可以使用标量字段来存储 Milvus 中存储的 Embedding 的元数据,并通过元数据过滤进行 ANN 搜索,以提高搜索结果的正确性。Milvus 支持多种标量字段类型,包括 VarCharBooleanInt、Float、DoubleArray 和 JSON。

添加字符串字段

在 Milvus 中,可以使用 VarChar 字段存储字符串。有关 VarChar 字段的更多信息,请参阅 字符串字段

Python
schema.add_field(
field_name="my_varchar",
datatype=DataType.VARCHAR,
max_length=512
)

添加数字字段

Milvus 支持的数字类型有 Int8,Int16,Int32,Int64,FloatDouble。有关数字字段的更多信息,请参阅 数字 字段。

Python
schema.add_field(
field_name="my_int64",
datatype=DataType.INT64,
)

添加布尔字段

Milvus 支持布尔字段。以下代码片段演示了如何添加布尔字段。

Python
schema.add_field(
field_name="my_bool",
datatype=DataType.BOOL,
)

添加 JSON 字段

JSON 字段通常存储半结构化的 JSON 数据。有关 JSON 字段的更多信息,请参阅 JSON 字段

Python
schema.add_field(
field_name="my_json",
datatype=DataType.JSON,
)

添加数组字段

数组字段存储元素列表。数组字段中所有元素的数据类型应相同。有关数组字段的更多信息,请参阅 数组 字段。

Python
schema.add_field(
field_name="my_array",
datatype=DataType.ARRAY,
element_type=DataType.VARCHAR,
max_capacity=5,
max_length=512,
)