變更外部集合結構Compatible with Milvus 3.0.x
建立外部集合後,外部資料來源往往會隨時間演變。例如,一個已儲存嵌入向量的湖屋資料表,日後可能會新增一個標量欄位(例如分數、類別或時間戳記),而您希望在查詢結果中返回該欄位,或將其用於篩選條件。
與其重新建立外部集合或將來源資料複製到 Milvus,不如新增一個 Milvus 欄位,使其對應至外部資料來源中的現有欄位。新增欄位後,請刷新外部集合,以便在查詢和搜尋中使用該新欄位。
限制
外部集合目前支援在建立後新增欄位。其他架構變更,例如刪除欄位、重新命名欄位、變更欄位資料類型、變更向量維度,或重新映射
external_field,均不被支援。您只能新增在外部資料來源中已存在的欄位。此操作會將現有的外部欄位映射至 Milvus 欄位,並不會在外部資料來源中建立新欄位,也不會回填來源資料。
不支援將
SPARSE_FLOAT_VECTOR欄位新增至現有的外部集合。不支援將 StructArray 欄位新增至現有的外部集合。若您的外部集合需要 StructArray 欄位,請在建立集合時於集合架構中定義該欄位。
新增欄位
在將欄位新增至外部集合之前,請先確認該欄位已存在於外部資料來源中。接著呼叫 `add_collection_field() ` 方法,並將 `external_field ` 設定為外部資料來源中的欄位名稱,以在 Milvus 中公開該欄位。將 `data_type ` 設定為與外部資料來源中該欄位相符的 Milvus 資料型別。例如,若映射的欄位儲存雙精度數值,請使用 `DataType.DOUBLE`。
與受管集合不同,新增欄位的值會在您刷新外部集合後,從外部資料來源讀取。
新增標量欄位
若要將該欄位包含在查詢結果中或用於篩選條件,請使用 `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 欄位名稱,而external_field="score" 將其映射至外部資料來源中的score 欄位。由於是在集合建立完成後才新增此欄位,因此需設定nullable=True 。
新增向量欄位
若外部資料來源已包含向量值,您亦可新增向量欄位。請將向量data_type 及dim 設定為與外部資料來源中的向量欄位相符。
以下範例新增了一個名為image_embedding_v2 的密集向量欄位。
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",
)
若您計劃對新增的向量欄位執行向量搜尋,請在刷新外部集合之前,先為該欄位建立索引。
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,
)
刷新外部集合
修改外部集合的資料結構後,請刷新外部集合,以便 Milvus 更新外部集合的元資料,並使資料結構變更在查詢、搜尋和篩選結果中生效。
client.refresh_external_collection(
collection_name="product_embeddings"
)