跳到主要内容

了解 Schema

Schema 定义了 Collection 的数据结构。在创建 Collection 之前,您需要根据业务需要,设计并创建好 Collection 的 Schema。本章将介绍设计与创建 Schema 时需要注意的相关事项。

概述

在 Zilliz Cloud 中,Collection Schema 和传统关系型数据库中的数据表结构类似,定义了 Collection 的数据组织方式。

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

如下图所示,一个典型的 Collection Schema 包含一个主键,若干向量列和若干标量列。下图说明了如何将一篇文章映射成一个 Collection Schema。

RFGTbrPmmoa7b8xAg34cRdUmnXe

搜索系统的数据模型设计通常包括分析业务需求,并将信息抽象为使用 Schema 表达的数据模型。例如,搜索一段文本时,必须通过 Embedding 将字面字符串转换为向量并对这些向量字段建立索引。除这一基本要求外,Schema 中可能还需要定义其他属性,如出版时间和作者。有了这些元数据(标量字段),就可以通过元数据过滤来完善语义搜索,以便返回特定日期之后或特定作者发表的文本。您还可以在搜索时要求在搜索结果中返回这些标量甚至主文本,然后在应用程序中呈现信息量更为丰富的搜索结果。您应该为每个标量分配一个以整数或字符串形式命名的唯一标识符,它们对于实现复杂的搜索逻辑至关重要。

关于如何结合您的数据完成 Schema 设计,可以参考 Schema 设计指南。该文通过一个示例演示了关于 Schema 设计的思考过程,帮助您了解如何设计一个符合业务需求的 Collection Schema。

创建 Schema

您可以参考如下代码创建一个 Schema 对象。

from pymilvus import MilvusClient, DataType

schema = MilvusClient.create_schema()

添加主键

主键唯一标识一个 Entity,只支持 Int64VarChar 类型的数据。具体添加方法如下:

schema.add_field(
field_name="my_id",
datatype=DataType.INT64,
# highlight-start
is_primary=True,
auto_id=False,
# highlight-end
)

当您在添加主键字段时,需要显式指定该字段为主键字段,即设置 is_primaryTrue。如果您选择使用 Int64 类型的主键,主键值应该类似 12345 这样的整数;如果您选择使用 VarChar 类型的主键,主键值应该类似于 'my_entity_1234' 这样的字符串。

您还可以通过设置 autoIdTrue 的方式让 Zilliz Cloud 自动为插入的 Entity 分配主键值。

关于主键字段的更多内容可参考主键与 AutoId

添加向量字段

向量字段用于存放各种类型的稀疏和稠密向量数据。在 Zilliz Cloud 中,您可以在一个 Collection 中添加最多 4 个向量字段。具体添加方法如下:

schema.add_field(
field_name="my_vector",
datatype=DataType.FLOAT_VECTOR,
# highlight-next-line
dim=5
)

在上述代码中使用的 dim 字段表示该字段可以存放的向量数据的维度,FLOAT_VECTOR 表示该字段可以存放的向量数据类型是一组 32 位浮点数。在科学计算和机器学习领域中,它们通常用来表示真数。除此之外,Zilliz Cloud 还支持如下几种向量类型:

  • FLOAT16_VECTOR

    用于存放 16 位半精浮点数列表,通常用于内存和带宽受限的深度学习和 GPU 计算场景。

  • BFLOAT16_VECTOR

    用于存放精度降低但指数范围与 Float32 相同的 16 位浮点数列表。这类数据通常用于深度学习场景,在降低内存占用的同时不会给准确度带来显著影响。

  • BINARY_VECTOR

    用于存放二进制数据,通常为一组由 0 和 1 组成的数字序列。它们在图像处理和信息检索场景下的用于表示数据的紧凑特征。

  • SPARSE_FLOAT_VECTOR

    用于存放一组非零元素及其序号,用来表示一个稀疏向量。

关于添加向量字段时的更多内容,可参考稀疏向量稠密向量Binary 向量

添加标量字段

通常情况下,您可以将标量字段做为向量字段的元数据添加到 Collection 中,通过向量搜索和标量过滤相结合的方式来提升搜索结果的准确性。Zilliz Cloud 支持多种标量数据类型,包括 VarCharBooleanIntFloatDoubleArrayJSON

添加字符串类型的字段

在 Zilliz Cloud 中,您可以使用 VarChar 类型的字段来存放字符串数据。关于 VarChar 字段的更多内容,可参考字符串类型

schema.add_field(
field_name="my_varchar",
datatype=DataType.VARCHAR,
# highlight-next-line
max_length=512
)

添加数值类型的字段

Zilliz Cloud 支持的数值类型字段包括 Int8Int16Int32Int64FloatDouble。关于数值类型的更多内容,可参考标量数值类型

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

添加 Boolean 类型的字段

Zilliz Cloud 支持 Boolean 类型的字段。您可以参考如下代码添加该类型的字段。

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

添加 JSON 类型的字段

JSON 类型的字段用于存放半结构化的 JSON 数据。关于 JSON 类型的更多内容,可参考JSON 类型

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

添加 Array 类型的字段

Array 字段用于存放列表类型的数据。Array 字段中的元素数据类型需要保持一致。关于 Array 类型的更多内容,可参考Array 类型

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