Alter External Collection Schema
创建 External Collection 后,外部数据源通常会继续演进。例如,一个已经存储 Embedding 的 Lakehouse 表,之后可能会新增一个标量字段,例如 score、category 或 timestamp,而你希望在查询结果中返回该字段,或在 Filter 中使用它。
无需重新创建 External Collection,也无需将源数据复制到 Milvus。你可以添加一个 Milvus 字段,并将其映射到外部数据源中的现有字段。添加字段后,刷新 External Collection,即可在查询和搜索中使用新字段。
Limits
-
External Collection 目前支持在创建后添加字段。其他 Schema 变更(例如删除字段、重命名字段、变更字段数据类型、变更向量维度或重新映射
external_field)均不受支持。 -
你只能添加外部数据源中已存在的字段。此操作会将现有外部字段映射到 Milvus 字段。它不会在外部数据源中创建新字段,也不会回填源数据。
-
不支持向现有 External Collection 添加
SPARSE_FLOAT_VECTOR字段。 -
不支持向现有 External Collection 添加 StructArray 字段。如果你的 External Collection 需要 StructArray 字段,请在创建 Collection 时在 Collection Schema 中定义该字段。
Add a field
在向 external collection 添加字段之前,请确认该字段已存在于外部数据源中。然后调用 add_collection_field(),并将 external_field 设置为外部数据源中的字段名,以在 Milvus 中暴露该字段。将 data_type 设置为与外部数据源中该字段匹配的 Milvus 数据类型。例如,如果映射字段存储双精度值,请使用 DataType.DOUBLE。
与 managed Collection 不同,新增字段的值会在你刷新 external collection 后从外部数据源读取。
添加标量字段
如果你希望在查询结果中返回某个 scalar field,或在 filter 中使用它,可以使用 add_collection_field() 添加该字段。以下示例添加了一个 score 字段,并将其映射到外部数据源中的 score 字段。
from pymilvus import DataType, MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus",
)
client.add_collection_field(
collection_name="product_embeddings",
field_name="score",
data_type=DataType.DOUBLE,
nullable=True,
external_field="score",
)
在此示例中,score 是 Milvus field name,external_field="score" 将其映射到外部数据源中的 score 字段。由于该字段是在 Collection 创建完成后添加的,因此需要设置 nullable=True。
添加 vector field
如果外部数据源已包含向量值,你也可以添加 vector field。请将向量的 data_type 和 dim 设置为与外部数据源中的 vector field 一致。
以下示例添加了一个名为 image_embedding_v2 的 dense vector field。
from pymilvus import DataType, MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus",
)
client.add_collection_field(
collection_name="product_embeddings",
field_name="image_embedding_v2",
data_type=DataType.FLOAT_VECTOR,
dim=768,
nullable=True,
external_field="image_embedding_v2",
)
如果你计划在新增的 vector field 上执行 vector search,请在刷新 external collection 之前为该字段创建索引。
index_params = client.prepare_index_params()
index_params.add_index(
field_name="image_embedding_v2",
index_type="AUTOINDEX",
metric_type="COSINE",
)
client.create_index(
collection_name="product_embeddings",
index_params=index_params,
)
Refresh the external collection
修改外部 Collection Schema 后,刷新外部 Collection,使 Milvus 更新外部 Collection metadata,并让 Schema 变更在查询、搜索和 Filter 结果中生效。
client.refresh_external_collection(
collection_name="product_embeddings"
)