模式說明
模式定義了集合的資料結構。在建立一個資料集之前,您需要設計一個模式。本頁可協助您瞭解集合模式,並自行設計一個範例模式。
概觀
在 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": []
}'
新增主要欄位
集合中的 primary 欄位唯一地識別一個實體。它只接受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 ,明確地將該欄位澄清為主要欄位。primary 欄位預設接受Int64值。在這種情況下,主字段值應該是類似12345 的整數。如果您選擇在主字段中使用VarChar值,則值應該是類似my_entity_1234 的字串。
您也可以設定autoId 屬性為True ,讓 Milvus 在插入資料時自動分配主字段值。
除非手動設定主鍵有好處,否則建議您在所有情況下都依賴autoId 。
詳情請參考Primary Field & 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。
新增字串欄位
在 Milvus 中,您可以使用 VarChar 欄位來儲存字串。關於 VarChar 欄位的更多資訊,請參考String Field。
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
]
}"