了解 Schema
Schema 定义了 Collection 的数据结构。在创建 Collection 之前,您需要根据业务需要,设计并创建好 Collection 的 Schema。本章将介绍设计与创建 Schema 时需要注意的相关事项。
概述
在 Zilliz Cloud 中,Collection Schema 和传统关系型数据库中的数据表结构类似,定义了 Collection 的数据组织方式。
精心设计的 Schema 至关重要,因为它抽象了数据模型,并决定了能否通过搜索实现业务目标。此外,由于插入到集合中的每一行数据都必须遵循 Schema 定义,从而保持数据的一致性和长期质量。从技术角度看,定义明确的 Schema 可实现有序的列数据存储和更简洁的索引结构,从而提高搜索性能。
如下图所示,一个典型的 Collection Schema 包含一个主键,若干向量列和若干标量列。下图说明了如何将一篇文章映射成一个 Collection Schema。
搜索系统的数据模型设计通常包括分析业务需求,并将信息抽象为使用 Schema 表达的数据模型。例如,搜索一段文本时,必须通过 Embedding 将字面字符串转换为向量并对这些向量字段建立索引。除这一基本要求外,Schema 中可能还需要定义其他属性,如出版时间和作者。有了这些元数据(标量字段),就可以通过元数据过滤来完善语义搜索,以便返回特定日期之后或特定作者发表的文本。您还可以在搜索时要求在搜索结果中返回这些标量甚至主文本,然后在应用程序中呈现信息量更为丰富的搜索结果。您应该为每个标量分配一个以整数或字符串形式命名的唯一标识符,它们对于实现复杂的搜索逻辑至关重要。
关于如何结合您的数据完成 Schema 设计,可以参考 Schema 设计指南。该文通过一个示例演示了关于 Schema 设计的思考过程,帮助您了解如何设计一个符合业务需求的 Collection Schema。
创建 Schema
您可以参考如下代码创建一个 Schema 对象。
- Python
- Java
- NodeJS
- cURL
from pymilvus import MilvusClient, DataType
schema = MilvusClient.create_schema()
import io.milvus.v2.service.collection.request.CreateCollectionReq;
CreateCollectionReq.CollectionSchema schema = client.createSchema();
import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
const schema = []
export schema='{
"fields": []
}'
添加主键
主键唯一标识一个 Entity,只支持 Int64 或 VarChar 类型的数据。具体添加方法如下:
- Python
- Java
- NodeJS
- cURL
schema.add_field(
field_name="my_id",
datatype=DataType.INT64,
# highlight-start
is_primary=True,
auto_id=False,
# highlight-end
)
import io.milvus.v2.common.DataType;
import io.milvus.v2.service.collection.request.AddFieldReq;
schema.addField(AddFieldReq.builder()
.fieldName("my_id")
.dataType(DataType.Int64)
// highlight-start
.isPrimaryKey(true)
.autoID(false)
// highlight-end
.build());
schema.push({
name: "my_id",
data_type: DataType.Int64,
// highlight-start
is_primary_key: true,
autoID: false
// highlight-end
});
export primaryField='{
"fieldName": "my_id",
"dataType": "Int64",
"isPrimary": true
}'
export schema='{
\"autoID\": false,
\"fields\": [
$primaryField
]
}'
当您在添加主键字段时,需要显式指定该字段为主键字段,即设置 is_primary
为 True
。如果您选择使用 Int64 类型的主键,主键值应该类似 12345
这样的整数;如果您选择使用 VarChar 类型的主键,主键值应该类似于 'my_entity_1234'
这样的字符串。
您还可以通过设置 autoId
为 True
的方式让 Zilliz Cloud 自动为插入的 Entity 分配主键值。
关于主键字段的更多内容可参考主键与 AutoId。
添加向量字段
向量字段用于存放各种类型的稀疏和稠密向量数据。在 Zilliz Cloud 中,您可以在一个 Collection 中添加最多 4 个向量字段。具体添加方法如下:
- Python
- Java
- NodeJS
- cURL
schema.add_field(
field_name="my_vector",
datatype=DataType.FLOAT_VECTOR,
# highlight-next-line
dim=5
)
schema.addField(AddFieldReq.builder()
.fieldName("my_vector")
.dataType(DataType.FloatVector)
// highlight-next-line
.dimension(5)
.build());
schema.push({
name: "my_vector",
data_type: DataType.FloatVector,
// highlight-next-line
dim: 5
});
export vectorField='{
"fieldName": "my_vector",
"dataType": "FloatVector",
"elementTypeParams": {
"dim": 5
}
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField
]
}"
在上述代码中使用的 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 支持多种标量数据类型,包括 VarChar、Boolean、Int、Float、Double、Array 和 JSON。
添加字符串类型的字段
在 Zilliz Cloud 中,您可以使用 VarChar 类型的字段来存放字符串数据。关于 VarChar 字段的更多内容,可参考字符串类型。
- Python
- Java
- NodeJS
- cURL
schema.add_field(
field_name="my_varchar",
datatype=DataType.VARCHAR,
# highlight-next-line
max_length=512
)
schema.addField(AddFieldReq.builder()
.fieldName("my_varchar")
.dataType(DataType.VarChar)
// highlight-next-line
.maxLength(512)
.build());
schema.push({
name: "my_varchar",
data_type: DataType.VarChar,
// highlight-next-line
max_length: 512
});
export varCharField='{
"fieldName": "my_varchar",
"dataType": "VarChar",
"elementTypeParams": {
"max_length": 256
}
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField,
$varCharField
]
}"
添加数值类型的字段
Zilliz Cloud 支持的数值类型字段包括 Int8
、Int16
、Int32
、Int64
、Float
和 Double
。关于数值类型的更多内容,可参考标量数值类型。
- Python
- Java
- NodeJS
- cURL
schema.add_field(
field_name="my_int64",
datatype=DataType.INT64,
)
schema.addField(AddFieldReq.builder()
.fieldName("my_int64")
.dataType(DataType.Int64)
.build());
schema.push({
name: "my_int64",
data_type: DataType.Int64,
});
export int64Field='{
"fieldName": "my_int64",
"dataType": "Int64"
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField,
$varCharField,
$int64Field
]
}"
添加 Boolean 类型的字段
Zilliz Cloud 支持 Boolean 类型的字段。您可以参考如下代码添加该类型的字段。
- Python
- Java
- NodeJS
- cURL
schema.add_field(
field_name="my_bool",
datatype=DataType.BOOL,
)
schema.addField(AddFieldReq.builder()
.fieldName("my_bool")
.dataType(DataType.Bool)
.build());
schema.push({
name: "my_bool",
data_type: DataType.Boolean,
});
export boolField='{
"fieldName": "my_bool",
"dataType": "Boolean"
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField,
$varCharField,
$int64Field,
$boolField
]
}"
添加 JSON 类型的字段
JSON 类型的字段用于存放半结构化的 JSON 数据。关于 JSON 类型的更多内容,可参考JSON 类型。
- Python
- Java
- NodeJS
- cURL
schema.add_field(
field_name="my_json",
datatype=DataType.JSON,
)
schema.addField(AddFieldReq.builder()
.fieldName("my_json")
.dataType(DataType.JSON)
.build());
schema.push({
name: "my_json",
data_type: DataType.JSON,
});
export jsonField='{
"fieldName": "my_json",
"dataType": "JSON"
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField,
$varCharField,
$int64Field,
$boolField,
$jsonField
]
}"
添加 Array 类型的字段
Array 字段用于存放列表类型的数据。Array 字段中的元素数据类型需要保持一致。关于 Array 类型的更多内容,可参考Array 类型。
- Python
- Java
- NodeJS
- cURL
schema.add_field(
field_name="my_array",
datatype=DataType.ARRAY,
element_type=DataType.VARCHAR,
max_capacity=5,
max_length=512,
)
schema.addField(AddFieldReq.builder()
.fieldName("my_array")
.dataType(DataType.Array)
.elementType(DataType.VarChar)
.maxCapacity(5)
.maxLength(512)
.build());
schema.push({
name: "my_array",
data_type: DataType.Array,
element_type: DataType.VarChar,
max_capacity: 5,
max_length: 512
});
export arrayField='{
"fieldName": "my_array",
"dataType": "Array",
"elementDataType": "VarChar",
"elementTypeParams": {
"max_length": 512
}
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField,
$varCharField,
$int64Field,
$boolField,
$jsonField,
$arrayField
]
}"