スキーマの説明
スキーマはコレクションのデータ構造を定義する。コレクションを作成する前に、スキーマを設計する必要があります。このページでは、コレクションのスキーマを理解し、自分でスキーマの例を設計するのに役立ちます。
概要
Milvusでは、コレクションスキーマはリレーショナルデータベースのテーブルを構成し、Milvusがコレクション内のデータをどのように整理するかを定義します。
スキーマはデータモデルを抽象化し、検索によってビジネス目的を達成できるかどうかを決定するため、よく設計されたスキーマは不可欠です。さらに、コレクションに挿入されるすべてのデータ行はスキーマに従わなければならないため、データの一貫性と長期的な品質の維持に役立ちます。技術的な観点からは、よく定義されたスキーマは、よく整理されたカラム・データ・ストレージとすっきりしたインデックス構造につながり、検索パフォーマンスを向上させます。
コレクション・スキーマには、プライマリ・キー、少なくとも1つのベクトル・フィールド、および複数のスカラー・フィールドがあります。次の図は、アーティクルをスキーマフィールドのリストにマッピングする方法を示している。
スキーマ設計の解剖
検索システムのデータモデル設計には、ビジネスニーズを分析し、情報をスキーマで表現されたデータモデルに抽象化することが含まれます。例えば、テキストの一部を検索するには、リテラル文字列を「埋め込み」によってベクトルに変換し、ベクトル検索を可能にすることで「インデックス化」しなければならない。この必須要件以外にも、出版物のタイムスタンプや著者などのプロパティを格納することが必要な場合がある。このメタデータにより、フィルタリングによってセマンティック検索を絞り込むことができ、特定の日付以降に出版されたテキストや、特定の著者によるテキストだけを返すことができる。アプリケーションで検索結果をレンダリングするために、メインテキストと一緒にこれらのスカラーを取得することもできます。これらのテキスト片を整理するために、それぞれに整数または文字列で表される一意の識別子を割り当てる必要があります。これらの要素は洗練された検索ロジックを実現するために不可欠です。
スキーマ設計ハンズオンを参照して、よく設計されたスキーマの作り方を把握してください。
スキーマの作成
以下のコード・スニペットは、スキーマの作成方法を示している。
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では、コレクションに4つのベクトルフィールドを追加することができます。以下のコードスニペットはベクターフィールドの追加方法を示しています。
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 フィールドの詳細については、文字列フィールドを参照してください。
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フィールドのキーやArrayフィールドのインデックスのように、より小さなサブフィールドに分割できるフィールドを指します。
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
]
}"