Schema设计 #

一、Schema概述 #

1.1 什么是Schema #

Schema 定义了 Collection 的结构,包括字段列表、描述信息和配置选项。

text
Schema结构:

┌─────────────────────────────────────────┐
│              Schema                      │
├─────────────────────────────────────────┤
│  字段列表 (Fields)                       │
│  ├── 字段1: id (主键)                    │
│  ├── 字段2: name (标量)                  │
│  ├── 字段3: embedding (向量)             │
│  └── ...                                │
├─────────────────────────────────────────┤
│  描述信息 (Description)                  │
├─────────────────────────────────────────┤
│  配置选项                                │
│  ├── enable_dynamic_field               │
│  └── auto_id                            │
└─────────────────────────────────────────┘

二、字段定义 #

2.1 FieldSchema参数 #

python
from pymilvus import FieldSchema, DataType

field = FieldSchema(
    name="field_name",
    dtype=DataType.INT64,
    is_primary=False,
    auto_id=False,
    description="字段描述",
    max_length=256,
    dim=768,
    element_type=DataType.VARCHAR,
    max_capacity=10
)

2.2 参数说明 #

参数 类型 说明
name str 字段名称
dtype DataType 数据类型
is_primary bool 是否主键
auto_id bool 是否自动生成ID
description str 字段描述
max_length int VARCHAR最大长度
dim int 向量维度
element_type DataType 数组元素类型
max_capacity int 数组最大容量

2.3 主键字段 #

python
id_field = FieldSchema(
    name="id",
    dtype=DataType.INT64,
    is_primary=True,
    auto_id=False,
    description="主键ID"
)

varchar_id_field = FieldSchema(
    name="id",
    dtype=DataType.VARCHAR,
    max_length=64,
    is_primary=True,
    auto_id=False,
    description="字符串主键"
)

2.4 向量字段 #

python
float_vector = FieldSchema(
    name="embedding",
    dtype=DataType.FLOAT_VECTOR,
    dim=768,
    description="浮点向量"
)

binary_vector = FieldSchema(
    name="binary_embedding",
    dtype=DataType.BINARY_VECTOR,
    dim=512,
    description="二进制向量"
)

float16_vector = FieldSchema(
    name="float16_embedding",
    dtype=DataType.FLOAT16_VECTOR,
    dim=768,
    description="16位浮点向量"
)

sparse_vector = FieldSchema(
    name="sparse_embedding",
    dtype=DataType.SPARSE_FLOAT_VECTOR,
    description="稀疏向量"
)

2.5 标量字段 #

python
int_field = FieldSchema(
    name="age",
    dtype=DataType.INT32,
    description="年龄"
)

float_field = FieldSchema(
    name="price",
    dtype=DataType.FLOAT,
    description="价格"
)

bool_field = FieldSchema(
    name="is_active",
    dtype=DataType.BOOL,
    description="是否激活"
)

varchar_field = FieldSchema(
    name="title",
    dtype=DataType.VARCHAR,
    max_length=512,
    description="标题"
)

2.6 复杂字段 #

python
json_field = FieldSchema(
    name="metadata",
    dtype=DataType.JSON,
    description="JSON元数据"
)

array_field = FieldSchema(
    name="tags",
    dtype=DataType.ARRAY,
    element_type=DataType.VARCHAR,
    max_capacity=20,
    max_length=64,
    description="标签数组"
)

int_array_field = FieldSchema(
    name="scores",
    dtype=DataType.ARRAY,
    element_type=DataType.INT32,
    max_capacity=100,
    description="分数数组"
)

三、CollectionSchema #

3.1 创建Schema #

python
from pymilvus import CollectionSchema

fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
    FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=512),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=768)
]

schema = CollectionSchema(
    fields=fields,
    description="文档集合",
    enable_dynamic_field=True
)

3.2 Schema参数 #

参数 类型 说明
fields list 字段列表
description str Schema描述
enable_dynamic_field bool 启用动态字段
auto_id bool 自动生成ID

3.3 动态字段 #

python
schema = CollectionSchema(
    fields=fields,
    description="支持动态字段的集合",
    enable_dynamic_field=True
)

data = [
    {
        "id": 1,
        "title": "文档标题",
        "embedding": [0.1] * 768,
        "author": "张三",
        "views": 1000,
        "tags": ["AI", "ML"]
    }
]

collection.insert(data)

四、主键设计 #

4.1 主键类型 #

text
主键类型:

┌─────────────────────────────────────────┐
│           INT64 主键                     │
├─────────────────────────────────────────┤
│  优点: 性能高、存储小                    │
│  缺点: 需要自己生成唯一ID                │
│  适用: 自增ID场景                       │
└─────────────────────────────────────────┘

┌─────────────────────────────────────────┐
│           VARCHAR 主键                   │
├─────────────────────────────────────────┤
│  优点: 可读性好、可使用业务ID            │
│  缺点: 性能略低、存储较大                │
│  适用: UUID、业务主键场景                │
└─────────────────────────────────────────┘

4.2 INT64主键 #

python
id_field = FieldSchema(
    name="id",
    dtype=DataType.INT64,
    is_primary=True,
    auto_id=False
)

data = [
    [1, 2, 3],
    ["文档1", "文档2", "文档3"],
    [[0.1]*768, [0.2]*768, [0.3]*768]
]

4.3 VARCHAR主键 #

python
id_field = FieldSchema(
    name="doc_id",
    dtype=DataType.VARCHAR,
    max_length=64,
    is_primary=True
)

import uuid

data = [
    [str(uuid.uuid4()), str(uuid.uuid4())],
    ["文档1", "文档2"],
    [[0.1]*768, [0.2]*768]
]

4.4 自动生成ID #

python
id_field = FieldSchema(
    name="id",
    dtype=DataType.INT64,
    is_primary=True,
    auto_id=True
)

data = [
    ["文档1", "文档2"],
    [[0.1]*768, [0.2]*768]
]

result = collection.insert(data)
print(result.primary_keys)

五、向量字段设计 #

5.1 向量维度选择 #

text
常用向量维度:

模型                    维度
──────────────────────────────
OpenAI text-embedding-3-small  1536
OpenAI text-embedding-3-large  3072
Sentence-BERT                  768
BERT-base                      768
ResNet50                       2048
VGG16                          4096
CLIP                           512

5.2 向量类型选择 #

python
float_vector = FieldSchema(
    name="embedding",
    dtype=DataType.FLOAT_VECTOR,
    dim=768
)

binary_vector = FieldSchema(
    name="binary_embedding",
    dtype=DataType.BINARY_VECTOR,
    dim=512
)

float16_vector = FieldSchema(
    name="float16_embedding",
    dtype=DataType.FLOAT16_VECTOR,
    dim=768
)

5.3 多向量字段 #

python
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
    FieldSchema(name="title_embedding", dtype=DataType.FLOAT_VECTOR, dim=384),
    FieldSchema(name="content_embedding", dtype=DataType.FLOAT_VECTOR, dim=768),
    FieldSchema(name="image_embedding", dtype=DataType.FLOAT_VECTOR, dim=512)
]

六、Schema验证 #

6.1 检查Schema #

python
collection = Collection("documents")
schema = collection.schema

print(f"描述: {schema.description}")
print(f"动态字段: {schema.enable_dynamic_field}")

for field in schema.fields:
    print(f"字段: {field.name}, 类型: {field.dtype}")
    if field.is_primary:
        print(f"  主键: 是")
    if field.auto_id:
        print(f"  自动ID: 是")

6.2 验证字段 #

python
def validate_field_value(field, value):
    if field.dtype == DataType.INT64:
        return isinstance(value, int)
    elif field.dtype == DataType.FLOAT:
        return isinstance(value, (int, float))
    elif field.dtype == DataType.VARCHAR:
        return isinstance(value, str) and len(value) <= field.max_length
    elif field.dtype == DataType.FLOAT_VECTOR:
        return isinstance(value, list) and len(value) == field.dim
    return True

七、Schema最佳实践 #

7.1 文档搜索Schema #

python
fields = [
    FieldSchema(
        name="doc_id",
        dtype=DataType.VARCHAR,
        max_length=64,
        is_primary=True,
        description="文档唯一标识"
    ),
    FieldSchema(
        name="title",
        dtype=DataType.VARCHAR,
        max_length=512,
        description="文档标题"
    ),
    FieldSchema(
        name="content",
        dtype=DataType.VARCHAR,
        max_length=65535,
        description="文档内容"
    ),
    FieldSchema(
        name="embedding",
        dtype=DataType.FLOAT_VECTOR,
        dim=1536,
        description="OpenAI嵌入向量"
    ),
    FieldSchema(
        name="metadata",
        dtype=DataType.JSON,
        description="元数据"
    ),
    FieldSchema(
        name="created_at",
        dtype=DataType.INT64,
        description="创建时间戳"
    )
]

schema = CollectionSchema(
    fields=fields,
    description="文档搜索集合",
    enable_dynamic_field=True
)

7.2 推荐系统Schema #

python
fields = [
    FieldSchema(
        name="item_id",
        dtype=DataType.INT64,
        is_primary=True,
        description="物品ID"
    ),
    FieldSchema(
        name="item_name",
        dtype=DataType.VARCHAR,
        max_length=256,
        description="物品名称"
    ),
    FieldSchema(
        name="category",
        dtype=DataType.VARCHAR,
        max_length=64,
        description="分类"
    ),
    FieldSchema(
        name="price",
        dtype=DataType.FLOAT,
        description="价格"
    ),
    FieldSchema(
        name="tags",
        dtype=DataType.ARRAY,
        element_type=DataType.VARCHAR,
        max_capacity=20,
        max_length=32,
        description="标签"
    ),
    FieldSchema(
        name="item_embedding",
        dtype=DataType.FLOAT_VECTOR,
        dim=128,
        description="物品嵌入向量"
    )
]

7.3 图像搜索Schema #

python
fields = [
    FieldSchema(
        name="image_id",
        dtype=DataType.INT64,
        is_primary=True,
        auto_id=True,
        description="图像ID"
    ),
    FieldSchema(
        name="image_url",
        dtype=DataType.VARCHAR,
        max_length=1024,
        description="图像URL"
    ),
    FieldSchema(
        name="category",
        dtype=DataType.VARCHAR,
        max_length=64,
        description="分类"
    ),
    FieldSchema(
        name="feature_vector",
        dtype=DataType.FLOAT_VECTOR,
        dim=2048,
        description="ResNet特征向量"
    ),
    FieldSchema(
        name="width",
        dtype=DataType.INT32,
        description="宽度"
    ),
    FieldSchema(
        name="height",
        dtype=DataType.INT32,
        description="高度"
    )
]

八、Schema修改 #

8.1 查看当前Schema #

python
collection = Collection("documents")
print(collection.schema)

8.2 动态添加字段数据 #

python
collection = Collection("documents")

data = [
    {
        "id": 1,
        "title": "文档标题",
        "embedding": [0.1] * 768,
        "new_field": "新字段值"
    }
]

collection.insert(data)

九、总结 #

Schema设计要点:

要点 说明
主键选择 INT64性能高,VARCHAR可读性好
向量维度 根据模型选择合适维度
动态字段 启用后可灵活添加字段
字段命名 遵循命名规范,见名知意
描述信息 添加描述便于维护

下一步,让我们学习数据类型!

最后更新:2026-04-04