milvus-logo
LFAI
首页
  • 用户指南

管理 Schema

本主题介绍 Milvus 中的 Schema。Schema 用于定义集合的属性和其中的字段。

字段 Schema

字段 Schema 是字段的逻辑定义。在定义Collection Schema管理 Collection之前,首先需要定义它。

Milvus 只支持在一个集合中使用一个主键字段。

字段 Schema 属性

属性说明 备注
name 要创建的集合中字段的名称 数据类型:
必填
dtype 字段的数据类型 必须填写
description 字段描述 数据类型: 字符串:
可选
is_primary 是否将字段设为主键字段 数据类型:布尔 ( 或 ):布尔型 (truefalse)。
主键字段必须填写
auto_id (主键字段必须) 启用或禁用自动 ID(主键)分配的开关。 TrueFalse
max_length (对 VARCHAR 字段必填) 允许插入字符串的最大长度。 [1, 65,535]
dim 向量的维数 数据类型:整数 ∈[1, 32768]。
密集向量场必填。稀疏向量场省略。
is_partition_key 该字段是否是分区键字段。 数据类型:布尔类型 (truefalse)。

创建字段 Schema

为降低数据插入的复杂性,Milvus 允许在创建字段 Schema 时为每个标量字段指定默认值,主键字段除外。这表明,如果在插入数据时某个字段为空,则您为该字段指定的默认值将适用。

创建常规字段 Schema :

from pymilvus import FieldSchema
id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, description="primary id")
age_field = FieldSchema(name="age", dtype=DataType.INT64, description="age")
embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128, description="vector")

# The following creates a field and use it as the partition key
position_field = FieldSchema(name="position", dtype=DataType.VARCHAR, max_length=256, is_partition_key=True)

创建带有默认字段值的字段 Schema :

from pymilvus import FieldSchema

fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
# configure default value `25` for field `age`
FieldSchema(name="age", dtype=DataType.INT64, default_value=25, description="age"),
embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128, description="vector")
]

支持的数据类型

DataType 定义字段包含的数据类型。不同的字段支持不同的数据类型。

  • 主键字段支持

    • INT64: numpy.int64
    • varchar: varchar
  • 标量字段支持

    • BOOL: 布尔型 (truefalse)
    • INT8: numpy.int8
    • INT16: numpy.int16
    • INT32: numpy.int32
    • INT64: numpy.int64
    • FLOAT:numpy.float32
    • DOUBLE: numpy.double
    • varchar: varchar
    • JSON:JSON
    • Array: 数组数组

    JSON 作为一种复合数据类型可用。JSON 字段由键值对组成。每个键都是字符串,值可以是数字、字符串、布尔值、数组或列表。有关详情,请参阅JSON:一种新的数据类型

  • 向量字段支持:

    • BINARY_VECTOR:将二进制数据存储为 0 和 1 的序列,用于图像处理和信息检索中的紧凑特征表示。
    • FLOAT_VECTOR:存储 32 位浮点数,常用于科学计算和机器学习中的实数表示。
    • FLOAT16_VECTOR:存储 16 位半精度浮点数,用于深度学习和 GPU 计算,以提高内存和带宽效率。
    • BFLOAT16_VECTOR:存储精度降低但指数范围与 Float32 相同的 16 位浮点数,在深度学习中很受欢迎,可在不明显影响精度的情况下降低内存和计算要求。
    • SPARSE_FLOAT_VECTOR:存储非零元素及其相应索引的列表,用于表示稀疏向量。更多信息,请参阅稀疏向量

    Milvus 支持在一个集合中包含多个向量场。更多信息,请参阅混合搜索

Collection Schema

Collection Schema 是集合的逻辑定义。通常,在定义Collection Schema 和管理集合之前,需要先定义字段Schema。

Collection Schema 属性

属性说明 备注
field 要创建的集合中的字段 必填
description 集合描述 数据类型:
可选
partition_key_field 用作分区键的字段名称。 数据类型: 字符串:
可选
enable_dynamic_field 是否启用 Dynamic Field 数据类型:true false
可选,默认为 。 有关 Dynamic Field 的详细信息,请参阅动态False
Schema和管理集合的用户指南。

创建Collection Schema

在定义Collection Schema 之前,先定义字段 Schema 。
from pymilvus import FieldSchema, CollectionSchema
id_field = FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, description="primary id")
age_field = FieldSchema(name="age", dtype=DataType.INT64, description="age")
embedding_field = FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=128, description="vector")

# Enable partition key on a field if you need to implement multi-tenancy based on the partition-key field
position_field = FieldSchema(name="position", dtype=DataType.VARCHAR, max_length=256, is_partition_key=True)

# Set enable_dynamic_field to True if you need to use dynamic fields. 
schema = CollectionSchema(fields=[id_field, age_field, embedding_field], auto_id=False, enable_dynamic_field=True, description="desc of a collection")

使用指定的 Schema 创建 Collection:

from pymilvus import Collection
collection_name1 = "tutorial_1"
collection1 = Collection(name=collection_name1, schema=schema, using='default', shards_num=2)
  • 可以使用shards_num 定义分区编号。
  • 通过在using 中指定别名,可以定义要创建集合的 Milvus 服务器。
  • 如果需要实施基于分区密钥的多租户,可以通过将is_partition_key 设置为True 来启用字段的分区密钥功能。
  • 如果需要启用Dynamic Field,可以通过在Collection Schema 中将enable_dynamic_field 设置为True 来启用动态Schema。


您还可以使用Collection.construct_from_dataframe 创建一个集合,它会自动从 DataFrame 生成Collection Schema 并创建一个集合。

import pandas as pd
df = pd.DataFrame({
    "id": [i for i in range(nb)],
    "age": [random.randint(20, 40) for i in range(nb)],
    "embedding": [[random.random() for _ in range(dim)] for _ in range(nb)],
    "position": "test_pos"
})

collection, ins_res = Collection.construct_from_dataframe(
'my_collection',
df,
primary_field='id',
auto_id=False
)

下一步

翻译自DeepLogo

反馈

此页对您是否有帮助?