メインコンテンツまでスキップ
バージョン: 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がデータ挿入時に主フィールド値を自動的に割り当てるようにすることもできます。

詳細については、プライマリフィールド & 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ビット浮動小数点数のリストを保持します。このタイプのデータはディープラーニングシナリオで一般的に使用され、精度に大きく影響を与えずにメモリ使用量を削減できます。

  • BINARY_VECTOR

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

  • SPARSE_FLOAT_VECTOR

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

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

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

文字列フィールドの追加

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

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

数値フィールドの追加

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

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

真偽値フィールドの追加

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

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

複合フィールドの追加

Milvusでは、複合フィールドはJSONフィールドのキーまたはArrayフィールドのインデックスのように、より小さなサブフィールドに分割できるフィールドです。

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,
)