模式說明

模式定義了集合的資料結構。在建立一個資料集之前,您需要設計一個模式。本頁可協助您瞭解集合模式,並自行設計一個範例模式。

概觀

在 Milvus 上,集合模式組合了關聯式資料庫中的一個表,它定義了 Milvus 如何組織集合中的資料。

一個設計良好的模式是非常重要的,因為它抽象了資料模型,並決定您是否可以透過搜尋來達成業務目標。此外,由於插入到資料集中的每一行資料都必須遵循模式,因此它有助於維持資料的一致性和長期品質。從技術角度來看,定義良好的模式可帶來組織良好的列資料儲存和更乾淨的索引結構,從而提升搜尋效能。

集合模式有一個主索引鍵、至少一個向量欄位和幾個標量欄位。下圖說明如何將文章映射到模式欄位清單。

Schema Design Anatomy 模式設計剖析

搜尋系統的資料模型設計包括分析業務需求,並將資訊抽象為模式表達的資料模型。舉例來說,搜尋一段文字必須透過「嵌入」將字面字串轉換為向量,並啟用向量搜尋來「建立索引」。除了這個基本要求之外,儲存其他屬性(例如出版時間戳和作者)可能也是必要的。這些元資料允許透過篩選來精細語意搜尋,僅傳回在特定日期之後或由特定作者出版的文字。您也可以擷取這些標量與主要文字,以便在應用程式中呈現搜尋結果。每個標量都應該指定一個唯一的識別碼,以整數或字串的形式來組織這些文字片段。這些元素對於達成精密的搜尋邏輯是不可或缺的。

請參閱模式設計實作,以瞭解如何製作設計良好的模式。

建立模式

以下程式碼片段示範如何建立模式。

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 欄位唯一地識別一個實體。它只接受Int64VarChar值。以下程式碼片段示範如何新增主字段。

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 支援多種標量欄位類型,包括VarCharBooleanIntFloatDouble

新增字串欄位

在 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
    ]
}"

免費嘗試托管的 Milvus

Zilliz Cloud 無縫接入,由 Milvus 提供動力,速度提升 10 倍。

開始使用
反饋

這個頁面有幫助嗎?