模式說明
模式定義了集合的資料結構。在建立集合之前,您需要先規劃其模式的設計。本頁面將協助您理解集合模式,並自行設計一個範例模式。
概述
在 Milvus 中,集合模式相當於關聯式資料庫中的資料表,用以定義 Milvus 如何組織集合中的資料。
一個設計完善的模式至關重要,因為它能抽象化資料模型,並決定您能否透過搜尋達成業務目標。此外,由於插入集合中的每一筆資料都必須遵循該模式,這有助於維持資料的一致性與長期品質。 從技術角度來看,定義完善的資料結構能使欄位資料儲存井然有序,並使索引結構更為簡潔,從而提升搜尋效能。
一個集合模式包含一個主鍵、至少一個向量欄位以及多個標量欄位。下圖說明了如何將一篇文章映射至一組模式欄位。
模式設計解剖
搜尋系統的資料模型設計涉及分析業務需求,並將資訊抽象化為以資料結構表達的資料模型。例如,要搜尋一段文字,必須透過「嵌入」將字面字串轉換為向量,並啟用向量搜尋,藉此進行「索引」。 除了這項基本要求之外,可能還需要儲存其他屬性,例如發佈時間戳記和作者。這些元資料可透過篩選機制來精確化語義搜尋,僅回傳特定日期之後發佈的文本,或由特定作者撰寫的文本。 您也可以將這些標量與主文本一併檢索,以便在應用程式中呈現搜尋結果。應為每個元素分配一個唯一的識別碼(以整數或字串形式表示),用以組織這些文本片段。這些元素對於實現複雜的搜尋邏輯至關重要。
請參閱《模式設計實作指南》,了解如何設計完善的模式。
建立模式
以下程式碼片段示範如何建立模式。
from pymilvus import MilvusClient, DataType
schema = MilvusClient.create_schema()
import io.milvus.v2.service.collection.request.CreateCollectionReq;
CreateCollectionReq.CollectionSchema schema = client.createSchema();
import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
const schema = []
import "github.com/milvus-io/milvus/client/v2/entity"
schema := entity.NewSchema()
export schema='{
"fields": []
}'
新增主鍵
集合中的主欄位用於唯一識別實體。它僅接受Int64或VARCHAR值。以下程式碼片段示範如何新增主欄位。
schema.add_field(
field_name="my_id",
datatype=DataType.INT64,
is_primary=True,
auto_id=False,
)
import io.milvus.v2.common.DataType;
import io.milvus.v2.service.collection.request.AddFieldReq;
schema.addField(AddFieldReq.builder()
.fieldName("my_id")
.dataType(DataType.Int64)
.isPrimaryKey(true)
.autoID(false)
.build());
schema.push({
name: "my_id",
data_type: DataType.Int64,
is_primary_key: true,
autoID: false
});
schema.WithField(entity.NewField().WithName("my_id").
WithDataType(entity.FieldTypeInt64).
WithIsPrimaryKey(true).
WithIsAutoID(false),
)
export primaryField='{
"fieldName": "my_id",
"dataType": "Int64",
"isPrimary": true
}'
export schema='{
\"autoID\": false,
\"fields\": [
$primaryField
]
}'
在新增欄位時,您可以透過將該欄位的 `is_primary ` 屬性設定為 `True`,來明確指定該欄位為主欄位。主欄位預設接受`Int64`值。在此情況下,主欄位值應為類似 `12345` 的整數。若您選擇在主欄位中使用`VARCHAR` 值,則該值應為類似 `my_entity_1234` 的字串。
您亦可將autoId 屬性設定為True ,讓 Milvus 在插入資料時自動分配主欄位值。
除非手動設定主鍵能帶來好處,否則建議您在所有情況下皆依賴autoId 。
詳情請參閱《主欄位與 AutoId》。
新增向量欄位
向量欄位支援各種稀疏與密集的向量嵌入格式。在 Milvus 上,您可以向集合中新增四個向量欄位。以下程式碼片段示範如何新增向量欄位。
schema.add_field(
field_name="my_vector",
datatype=DataType.FLOAT_VECTOR,
dim=5
)
schema.addField(AddFieldReq.builder()
.fieldName("my_vector")
.dataType(DataType.FloatVector)
.dimension(5)
.build());
schema.push({
name: "my_vector",
data_type: DataType.FloatVector,
dim: 5
});
schema.WithField(entity.NewField().WithName("my_vector").
WithDataType(entity.FieldTypeFloatVector).
WithDim(5),
)
export vectorField='{
"fieldName": "my_vector",
"dataType": "FloatVector",
"elementTypeParams": {
"dim": 5
}
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField
]
}"
上述程式碼片段中的dim 參數,表示將儲存在向量欄位中的向量嵌入維度。FLOAT_VECTOR 的值表示該向量欄位儲存一組 32 位元浮點數,這些數值通常用於表示反對數。此外,Milvus 還支援以下類型的向量嵌入:
FLOAT16_VECTOR此類型的向量場儲存一組 16 位元半精度浮點數,通常適用於記憶體或頻寬受限的深度學習或基於 GPU 的運算情境。
BFLOAT16_VECTOR此類向量場包含一組 16 位元浮點數,其精度雖較低,但指數範圍與 Float32 相同。此類資料常見於深度學習情境,因其能在不顯著影響精度的情況下減少記憶體使用量。
INT8_VECTOR此類向量場儲存由 8 位元有符號整數(int8)組成的向量,每個分量範圍為 –128 至 127。 此類型專為量化深度學習架構(例如 ResNet 和 EfficientNet)量身打造,能大幅縮小模型大小並提升推論速度,同時僅造成極小的精度損失。注意:此向量類型僅支援 HNSW 索引。
BINARY_VECTOR此類向量場包含一組由 0 和 1 組成的清單。它們在影像處理與資訊檢索情境中,作為表示資料的緊湊特徵。
SPARSE_FLOAT_VECTOR此類向量欄位包含一組非零數及其序號,用以表示稀疏向量嵌入。
新增標量欄位
在常見情況下,您可以使用標量欄位來儲存 Milvus 中儲存的向量嵌入的元資料,並透過元資料篩選進行人工神經網路(ANN)搜尋,以提升搜尋結果的正確性。Milvus 支援多種標量欄位類型,包括VARCHAR、Boolean、Int、Float 和Double。
新增 VARCHAR 欄位
在 Milvus 中,您可以使用VARCHAR 字段來儲存字串。有關VARCHAR 字段的更多資訊,請參閱VarChar 字段。
schema.add_field(
field_name="my_varchar",
datatype=DataType.VARCHAR,
max_length=512
)
schema.addField(AddFieldReq.builder()
.fieldName("my_varchar")
.dataType(DataType.VarChar)
.maxLength(512)
.build());
schema.push({
name: "my_varchar",
data_type: DataType.VarChar,
max_length: 512
});
schema.WithField(entity.NewField().WithName("my_varchar").
WithDataType(entity.FieldTypeVarChar).
WithMaxLength(512),
)
export varCharField='{
"fieldName": "my_varchar",
"dataType": "VarChar",
"elementTypeParams": {
"max_length": 512
}
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField,
$varCharField
]
}"
新增數值欄位
Milvus 支援的數值類型包括Int8 、Int16 、Int32 、Int64 、Float 以及Double 。有關數值欄位的更多資訊,請參閱《數值欄位》。
schema.add_field(
field_name="my_int64",
datatype=DataType.INT64,
)
schema.addField(AddFieldReq.builder()
.fieldName("my_int64")
.dataType(DataType.Int64)
.build());
schema.push({
name: "my_int64",
data_type: DataType.Int64,
});
schema.WithField(entity.NewField().WithName("my_int64").
WithDataType(entity.FieldTypeInt64),
)
export int64Field='{
"fieldName": "my_int64",
"dataType": "Int64"
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField,
$varCharField,
$int64Field
]
}"
新增布林欄位
Milvus 支援布林欄位。以下程式碼片段示範如何新增布林欄位。
schema.add_field(
field_name="my_bool",
datatype=DataType.BOOL,
)
schema.addField(AddFieldReq.builder()
.fieldName("my_bool")
.dataType(DataType.Bool)
.build());
schema.push({
name: "my_bool",
data_type: DataType.Boolean,
});
schema.WithField(entity.NewField().WithName("my_bool").
WithDataType(entity.FieldTypeBool),
)
export boolField='{
"fieldName": "my_bool",
"dataType": "Boolean"
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField,
$varCharField,
$int64Field,
$boolField
]
}"
新增複合欄位
在 Milvus 中,複合欄位是指可細分為較小子欄位的欄位,例如 JSON 欄位中的鍵,或是陣列欄位中的索引。
新增 JSON 欄位
JSON 欄位通常用於儲存半結構化 JSON 資料。有關 JSON 欄位的更多資訊,請參閱JSON 欄位。
schema.add_field(
field_name="my_json",
datatype=DataType.JSON,
)
schema.addField(AddFieldReq.builder()
.fieldName("my_json")
.dataType(DataType.JSON)
.build());
schema.push({
name: "my_json",
data_type: DataType.JSON,
});
schema.WithField(entity.NewField().WithName("my_json").
WithDataType(entity.FieldTypeJSON),
)
export jsonField='{
"fieldName": "my_json",
"dataType": "JSON"
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField,
$varCharField,
$int64Field,
$boolField,
$jsonField
]
}"
新增陣列欄位
陣列欄位用於儲存一組元素。陣列欄位中所有元素的資料型別應保持一致。有關陣列欄位的更多資訊,請參閱「陣列欄位」。
schema.add_field(
field_name="my_array",
datatype=DataType.ARRAY,
element_type=DataType.VARCHAR,
max_capacity=5,
max_length=512,
)
schema.addField(AddFieldReq.builder()
.fieldName("my_array")
.dataType(DataType.Array)
.elementType(DataType.VarChar)
.maxCapacity(5)
.maxLength(512)
.build());
schema.push({
name: "my_array",
data_type: DataType.Array,
element_type: DataType.VarChar,
max_capacity: 5,
max_length: 512
});
schema.WithField(entity.NewField().WithName("my_array").
WithDataType(entity.FieldTypeArray).
WithElementType(entity.FieldTypeInt64).
WithMaxLength(512).
WithMaxCapacity(5),
)
export arrayField='{
"fieldName": "my_array",
"dataType": "Array",
"elementDataType": "VarChar",
"elementTypeParams": {
"max_length": 512
}
}'
export schema="{
\"autoID\": false,
\"fields\": [
$primaryField,
$vectorField,
$varCharField,
$int64Field,
$boolField,
$jsonField,
$arrayField
]
}"