Schema 演进
Zvec 支持动态 Schema 演进,允许你在 Collection 创建后修改其结构——无需停机、数据重新导入或重新索引。
支持的操作:
- ✅ 添加或删除标量字段
- ✅ 重命名字段或更改数据类型(需确保变更安全,如从
INT32到INT64) - ✅ 创建或删除字段索引
- ❌ 添加或删除向量字段(🔜 即将支持)
数据定义语言(DDL)
在 Zvec 中,Schema 变更通过**数据定义语言(DDL)**方法执行,分为两类:
前置条件
本指南假设你已打开一个 Collection 并准备好了 collection 对象。
Column DDL
添加列
使用 add_column() 向已有 Collection 添加新的标量字段:
import zvec
new_field = zvec.FieldSchema(name="rating", data_type=zvec.DataType.INT32)
collection.add_column(field_schema=new_field, expression="5") field_schema: 定义新字段的名称和数据类型。详见标量字段 Schema。expression: 为已有 Document 指定默认值。由于已有 Document 没有rating字段,Zvec 使用此expression填充缺失值——本例中将所有现有 Document 的rating设为 5。
目前仅支持通过 add_column() 添加数值型标量字段。对 string 和 boolean 类型的支持即将推出。
因此,expression 必须求值为数字——可以是单个数字字面量(如 "5")或涉及已有数值字段的简单算术表达式(如 "publish_year + 1")。
删除列
使用 drop_column() 永久删除标量字段:
collection.drop_column(field_name="publish_year")此操作会从 Collection 中每个 Document 删除该字段及其所有数据。该操作不可逆。
修改列
使用 alter_column() 重命名列或更新其 Schema:
# 重命名
collection.alter_column(old_name="publish_year", new_name="release_year")
# 更改类型(需兼容)
updated = zvec.FieldSchema(name="rating", data_type=zvec.DataType.FLOAT)
collection.alter_column(field_schema=updated) 查看当前 Schema
修改完成后,你可以随时打印 Schema 来查看 Collection 的当前结构:
print(collection.schema)详见 Schema 示例。
Index DDL
创建索引
你可以使用 create_index() 在向量和标量字段上创建(或替换)索引以加速搜索:
import zvec
# 将已有的 HNSW 索引替换为 FLAT 索引
collection.create_index(
field_name="dense_embedding",
index_param=zvec.FlatIndexParam(metric_type=zvec.MetricType.COSINE),
)
# 创建倒排索引
collection.create_index(
field_name="publish_year",
index_param=zvec.InvertIndexParam(),
)- 向量字段必须使用以下索引类型之一:
HnswIndexParamHnswRabitqIndexParamIVFIndexParamFlatIndexParam
- 标量字段使用
InvertIndexParam以启用高效过滤。
删除索引
使用 drop_index() 删除标量字段上的索引:
collection.drop_index(field_name="publish_year")不允许删除向量字段的索引。 在 Zvec 中,每个向量字段必须始终有且仅有一个索引以支持相似度搜索。