Milvus:Schema详解(四)

一、模式(Schema)的核心概念

在 Milvus 中,Schema 就像是数据的 "蓝图",它定义了集合(Collection)的数据结构。如果把集合比作一个 "表格",那么 Schema 就是这个表格的 "表头设计"------ 规定了表格里有哪些字段、每个字段存什么类型的数据、哪些字段是核心标识等。
为什么 Schema 如此重要?

  • 数据一致性:所有插入集合的实体都必须遵循 Schema,避免数据格式混乱;
  • 搜索效率:合理的 Schema 设计能让数据存储更有序,索引结构更简洁,直接提升搜索性能;
  • 业务适配:Schema 直接决定了能否通过搜索实现业务目标,比如能否按时间过滤、能否关联多维度信息等。
    举个生活中的例子:如果我们要建一个 "图书档案库"(集合),Schema 就需要定义 "图书 ID"(主键)、"图书内容向量"(向量字段)、"出版时间"(标量字段)、"作者"(标量字段)等,这样才能规范地管理和检索图书。

二、Schema 的组成结构

一个完整的 Milvus Schema 由三部分组成:

  1. 主键字段:唯一标识每个实体(类似身份证号);

  2. 向量字段:存储向量嵌入(用于相似性搜索的核心数据);

  3. 标量字段:存储元数据(用于过滤、排序或结果展示)。
    下图直观展示了一个文章搜索场景的 Schema 结构:

    文章集合 Schema
    ├─ 主键字段:article_id(唯一标识每篇文章)
    ├─ 向量字段:content_vector(文章内容的向量嵌入)
    ├─ 标量字段:
    │ ├─ publish_time(发布时间,用于按时间过滤)
    │ ├─ author(作者,用于按作者过滤)
    │ ├─ title(标题,用于结果展示)
    │ └─ is_published(是否发布,布尔类型过滤)

三、创建 Schema 的完整步骤

1. 初始化 Schema

首先需要创建一个空的 Schema 对象,后续再向其中添加字段。

python 复制代码
from pymilvus import MilvusClient, DataType

# 初始化 Milvus 客户端
client = MilvusClient(uri="http://localhost:19530", token="root:Milvus")

# 创建一个空的 Schema
schema = MilvusClient.create_schema()

2. 添加主键字段

主键字段是集合中每个实体的唯一标识,相当于 "身份证号",必须设置且唯一。

主键字段的核心属性:
  • 数据类型 :仅支持 INT64(整数)或 VARCHAR(字符串);
  • is_primary :必须设为 True(标识为主键);
  • auto_id :是否自动生成主键(True 则插入时无需指定,False 则需手动输入)。
示例 1:整数类型主键(手动指定 ID)
python 复制代码
schema.add_field(
    field_name="article_id",  # 字段名:文章ID
    datatype=DataType.INT64,  # 数据类型:64位整数
    is_primary=True,          # 标识为主键
    auto_id=False             # 不自动生成,需手动输入
)

此时插入数据时,必须指定 article_id 的值(如 1001、1002)。

示例 2:字符串类型主键(自动生成 ID)
python 复制代码
schema.add_field(
    field_name="user_id",
    datatype=DataType.VARCHAR,  # 数据类型:字符串
    max_length=64,              # 字符串最大长度(必填)
    is_primary=True,
    auto_id=True                # 自动生成唯一字符串ID
)

此时插入数据时,无需指定 user_id,Milvus 会自动生成类似 usr_6f2d9b 的唯一标识。

3. 添加向量字段

向量字段是 Milvus 用于相似性搜索的核心,存储将文本、图像等转化后的向量嵌入。一个集合最多可添加 4 个向量字段。

常见向量类型及适用场景:
示例:添加文本向量字段
python 复制代码
schema.add_field(
    field_name="content_vector",  # 字段名:内容向量
    datatype=DataType.FLOAT_VECTOR,  # 类型:32位浮点数向量
    dim=768  # 向量维度(必填):如BERT模型生成的向量通常为768维
)

这里的 dim 参数必须与实际生成的向量维度一致,否则插入会失败。

4. 添加标量字段

标量字段用于存储元数据,支持过滤、排序或结果展示。Milvus 支持多种标量类型,以下是常用类型的示例:

(1)字符串字段(VARCHAR)

用于存储文本信息(如标题、描述),需指定最大长度。

python 复制代码
schema.add_field(
    field_name="title",  # 字段名:文章标题
    datatype=DataType.VARCHAR,
    max_length=512  # 最大长度512字符
)
(2)数字字段(整数 / 浮点数)

用于存储数量、时间戳等,支持 INT8/INT16/INT32/INT64(整数)和 FLOAT/DOUBLE(浮点数)。

python 复制代码
# 示例:添加发布时间戳(整数类型)
schema.add_field(
    field_name="publish_timestamp",
    datatype=DataType.INT64  # 存储Unix时间戳(毫秒级)
)

# 示例:添加评分(浮点数类型)
schema.add_field(
    field_name="rating",
    datatype=DataType.FLOAT  # 如3.5、4.2等评分
)
(3)布尔字段(BOOL)

用于存储 "是 / 否" 类信息(如是否发布、是否推荐)。

python 复制代码
schema.add_field(
    field_name="is_recommended",
    datatype=DataType.BOOL  # 值为True或False
)
(4)JSON 字段

用于存储半结构化数据(如复杂的属性配置)。

python 复制代码
schema.add_field(
    field_name="metadata",
    datatype=DataType.JSON  # 可存储{"source": "web", "tags": ["tech", "ai"]}等
)
(5)数组字段(ARRAY)

用于存储同类型元素的列表(如标签列表、作者列表),需指定元素类型和最大容量。

python 复制代码
schema.add_field(
    field_name="tags",
    datatype=DataType.ARRAY,
    element_type=DataType.VARCHAR,  # 数组元素为字符串
    max_capacity=10,  # 最多存储10个标签
    max_length=64  # 每个标签最大长度64字符
)

此时该字段可存储类似 ["机器学习", "Milvus", "向量数据库"] 的数据。

5. 完整 Schema 示例(文章搜索场景)

python 复制代码
from pymilvus import MilvusClient, DataType

client = MilvusClient(uri="http://localhost:19530", token="root:Milvus")

# 创建Schema
schema = MilvusClient.create_schema(
    description="Schema for article search",  # 可选:添加描述
    enable_dynamic_field=False  # 关闭动态字段(严格遵循定义的字段)
)

# 添加主键字段
schema.add_field(
    field_name="article_id",
    datatype=DataType.INT64,
    is_primary=True,
    auto_id=False
)

# 添加向量字段(文章内容向量)
schema.add_field(
    field_name="content_vector",
    datatype=DataType.FLOAT_VECTOR,
    dim=768
)

# 添加标量字段
schema.add_field(
    field_name="title",
    datatype=DataType.VARCHAR,
    max_length=512
)
schema.add_field(
    field_name="publish_timestamp",
    datatype=DataType.INT64
)
schema.add_field(
    field_name="author",
    datatype=DataType.VARCHAR,
    max_length=128
)
schema.add_field(
    field_name="is_published",
    datatype=DataType.BOOL
)
schema.add_field(
    field_name="tags",
    datatype=DataType.ARRAY,
    element_type=DataType.VARCHAR,
    max_capacity=10,
    max_length=64
)

# 查看Schema结构
print("Schema详情:")
for field in schema.fields:
    print(f"字段名:{field.name},类型:{field.dtype},是否主键:{field.is_primary}")

四、Schema 设计的注意事项

  1. 提前规划字段:Schema 一旦创建(集合创建后),字段类型和主键属性无法修改,需提前确认业务需求;
  2. 向量维度匹配 :向量字段的 dim 必须与实际生成的向量维度一致(如模型输出为 1024 维,则 dim=1024);
  3. 合理设置长度 :VARCHAR 和数组的 max_length 不宜过大(避免浪费空间),也不宜过小(避免数据截断);
  4. 动态字段开关 :enable_dynamic_field=True 时允许插入未定义的字段,但会影响性能,建议关闭。

五、总结

Schema 是 Milvus 集合的 "骨架",它决定了数据的组织方式和搜索能力。设计时需结合业务场景,明确主键、向量字段和标量字段的用途,确保既能满足相似性搜索需求,又能通过元数据过滤提升结果准确性,后续会针对每种类型进行详细介绍。

相关推荐
CAD老兵6 小时前
量化技术:如何让你的 3D 模型和 AI 模型瘦身又飞快
人工智能·深度学习·机器学习
算法与编程之美6 小时前
探索不同的优化器对分类精度的影响和卷积层的输入输出的shape的计算公式
人工智能·深度学习·机器学习·分类·数据挖掘
大千AI助手6 小时前
微软SPARTA框架:高效稀疏注意力机制详解
人工智能·深度学习·神经网络·llm·大千ai助手·sparta·稀疏注意力机制
林九生6 小时前
【人工智能】使用 vLLM 高效部署大语言模型:以 secGpt14b 为例
人工智能·语言模型·自然语言处理
梨轻巧6 小时前
pyside6常用控件:QComboBox() 下拉菜单
python
云茧6 小时前
机器学习中的Hello World:线性回归(一)
人工智能·机器学习·线性回归
kyle~6 小时前
CPU调度---协程
java·linux·服务器·数据库·c++20
IDOlaoluo6 小时前
SQL Server 2017 Developer 中文版安装教程(64位 ISO 文件详细步骤)
服务器·数据库·负载均衡
嵌入式-老费6 小时前
自己动手写深度学习框架(快速学习python和关联库)
开发语言·python·学习