模式說明

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

概述

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

新增主鍵

集合中的主欄位用於唯一識別實體。它僅接受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`,來明確指定該欄位為主欄位。主欄位預設接受`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 支援多種標量欄位類型,包括VARCHARBooleanIntFloatDouble

新增 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 支援的數值類型包括Int8Int16Int32Int64Float 以及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
    ]
}"

翻譯者DeepL

免費嘗試托管的 Milvus

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

開始使用
反饋

這個頁面有幫助嗎?