メインコンテンツまでスキップ
バージョン: User Guides (BYOC)

スキーマの解説

スキーマは、コレクションのデータ構造を定義します。コレクションを作成する前に、そのスキーマの設計を行う必要があります。このページでは、コレクションのスキーマを理解し、独自のスキーマの設計例を作成する方法を説明します。

概要

Zilliz Cloud では、コレクションのスキーマはリレーショナルデータベースのテーブルに相当し、Zilliz Cloud がコレクション内のデータをどのように構成するかを定義します。

よく設計されたスキーマは不可欠です。なぜなら、データモデルを抽象化し、検索を通じてビジネス目標を達成できるかどうかを決定するからです。さらに、コレクションに挿入されるすべてのデータ行はスキーマに従う必要があるため、データの一貫性と長期的な品質の維持に役立ちます。技術的な観点からは、明確に定義されたスキーマにより、列データの保存が適切に整理され、インデックス構造がシンプルになり、検索パフォーマンスが向上します。

コレクションのスキーマには、プライマリキー、少なくとも1つのベクトルフィールド、および複数のスカラーフィールドが含まれます。次の図は、記事をスキーマフィールドのリストにマッピングする方法を示しています。

RoJFbyTsuoY8mHxoBBicgBH9nTc

検索システムのデータモデル設計には、ビジネスニーズの分析と、スキーマで表現されるデータモデルへの情報の抽象化が含まれます。例えば、テキストの検索では、リテラル文字列を「埋め込み(embedding)」によってベクトルに変換し、ベクトル検索を有効にすることで「インデックス化」する必要があります。この必須要件に加えて、公開タイムスタンプや著者などの他のプロパティを保存する必要がある場合もあります。このメタデータにより、フィルタリングを通じてセマンティック検索を絞り込むことができ、特定の日付以降に公開されたテキストや、特定の著者によるテキストのみを返すことができます。また、これらのスカラーをメインテキストとともに取得して、アプリケーションで検索結果を表示することもできます。これらのテキストを整理するために、それぞれに一意の識別子を割り当てる必要があり、これは整数または文字列として表現されます。これらの要素は、高度な検索ロジックを実現するために不可欠です。

よく設計されたスキーマの作成方法については、スキーマ設計の実践 を参照してください。

スキーマの作成

次のコードスニペットは、スキーマを作成する方法を示しています。

from pymilvus import MilvusClient, DataType

schema = MilvusClient.create_schema()

主キーの追加

コレクション内の主キーは、エンティティを一意に識別します。このフィールドには Int64 または VarChar 値のみを受け付けます。以下のコードスニペットは、主キーを追加する方法を示しています。

schema.add_field(
field_name="my_id",
datatype=DataType.INT64,
is_primary=True,
auto_id=False,
)

フィールドを追加する際、is_primary プロパティを True に設定することで、そのフィールドをプライマリフィールドとして明示的に指定できます。プライマリフィールドはデフォルトで Int64 値を受け入れます。この場合、プライマリフィールドの値は 12345 のような整数である必要があります。プライマリフィールドで VarChar 値を使用する場合、値は my_entity_1234 のような文字列である必要があります。

また、autoId プロパティを True に設定することで、データ挿入時に Zilliz Cloud が自動的にプライマリフィールドの値を割り当てるようにすることもできます。

📘Notes

手動での主キー設定にメリットがある場合を除き、すべてのケースで autoId の使用を推奨します。

詳細については、プライマリフィールドと AutoId を参照してください。

ベクトルフィールドの追加

ベクトルフィールドは、さまざまなスパースおよびデンスベクトル埋め込みを受け入れます。Zilliz Cloud では、コレクションに4つのベクトルフィールドを追加できます。以下のコードスニペットは、ベクトルフィールドを追加する方法を示しています。

schema.add_field(
field_name="my_vector",
datatype=DataType.FLOAT_VECTOR,
dim=5
)

上記のコードスニペットにおける dim パラメータは、ベクターフィールドに格納されるベクトル埋め込みの次元数を示します。FLOAT_VECTOR の値は、ベクターフィールドが32ビット浮動小数点数のリストを保持することを示しており、これは通常対数を表現するために使用されます。加えて、Zilliz Cloud は以下のタイプのベクトル埋め込みもサポートしています:

  • FLOAT16_VECTOR

    このタイプのベクターフィールドは、16ビット半精度浮動小数点数のリストを保持し、通常、メモリや帯域幅が制限されたディープラーニングやGPUベースのコンピューティングシナリオに適用されます。

  • BFLOAT16_VECTOR

    このタイプのベクターフィールドは、精度は低下しているがFloat32と同じ指数範囲を持つ16ビット浮動小数点数のリストを保持します。このタイプのデータは、精度に大きな影響を与えることなくメモリ使用量を削減できるため、ディープラーニングシナリオで一般的に使用されます。

  • INT8_VECTOR

    このタイプのベクターフィールドは、8ビット符号付き整数(int8)で構成されたベクトルを格納し、各成分の範囲は –128 から 127 です。ResNet や EfficientNet などの量子化されたディープラーニングアーキテクチャ向けに設計されており、モデルサイズを大幅に縮小し、推論速度を向上させながら、わずかな精度損失のみで済みます。: このベクトルタイプは HNSW インデックスでのみサポートされています。

  • BINARY_VECTOR

    このタイプのベクターフィールドは、0 と 1 のリストを保持します。これらは、画像処理や情報検索シナリオにおいてデータを表現するためのコンパクトな特徴量として機能します。

  • SPARSE_FLOAT_VECTOR

    このタイプのベクターフィールドは、非ゼロの数値とそのシーケンス番号のリストを保持し、スパースベクトル埋め込みを表現します。

スカラーフィールドの追加

一般的なケースでは、スカラーフィールドを使用して Zilliz Cloud クラスタに格納されたベクトル埋め込みのメタデータを保存し、メタデータフィルタリングを伴う ANN 検索を実行して、検索結果の正確性を向上させることができます。Zilliz Cloud は、VarCharBooleanIntFloatDouble を含む複数のスカラーフィールドタイプをサポートしています。

文字列フィールドの追加

Zilliz Cloud クラスタでは、VarChar フィールドを使用して文字列を格納できます。VarChar フィールドの詳細については、文字列フィールド を参照してください。

schema.add_field(
field_name="my_varchar",
datatype=DataType.VARCHAR,
max_length=512
)

数値フィールドの追加

Zilliz Cloud がサポートする数値型は、Int8Int16Int32Int64FloatDouble です。数値フィールドの詳細については、数値フィールド を参照してください。

schema.add_field(
field_name="my_int64",
datatype=DataType.INT64,
)

Booleanフィールドの追加

Zilliz Cloudはbooleanフィールドをサポートしています。以下のコードスニペットは、booleanフィールドを追加する方法を示しています。

schema.add_field(
field_name="my_bool",
datatype=DataType.BOOL,
)

複合フィールドの追加

Milvus では、複合フィールドとは、JSON フィールド内のキーや配列フィールド内のインデックスなど、より小さなサブフィールドに分割できるフィールドを指します。

JSON フィールドの追加

JSON フィールドは通常、半構造化の JSON データを格納します。JSON フィールドの詳細については、JSON フィールド を参照してください。

schema.add_field(
field_name="my_json",
datatype=DataType.JSON,
)

配列フィールドの追加

配列フィールドは要素のリストを格納します。配列フィールド内のすべての要素のデータ型は同じである必要があります。配列フィールドの詳細については、配列フィールド を参照してください。

schema.add_field(
field_name="my_array",
datatype=DataType.ARRAY,
element_type=DataType.VARCHAR,
max_capacity=5,
max_length=512,
)