メインコンテンツまでスキップ

スキーマの解説

スキーマはコレクションのデータ構造を定義するものです。コレクションを作成する前に、そのスキーマを設計する必要があります。このページでは、コレクションスキーマの理解を深め、実際にスキーマを設計できるようになるための情報を提供します。

概要

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

適切に設計されたスキーマは、データモデルを抽象化し、検索によってビジネス目標を達成できるかを左右するため、極めて重要です。さらに、コレクションに挿入されるすべてのデータ行はスキーマに従う必要があるため、データの一貫性と長期的な品質維持にも役立ちます。技術的な観点からも、明確に定義されたスキーマは列データのストレージを整然とさせ、インデックス構造を最適化することで、検索パフォーマンスを向上させます。

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

RoJFbyTsuoY8mHxoBBicgBH9nTc

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

適切なスキーマの作成方法については、スキーマ設計ハンズオン を参照してください。

スキーマの作成

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

python
from pymilvus import MilvusClient, DataType

schema = MilvusClient.create_schema()

プライマリフィールドの追加

コレクション内のプライマリフィールドは、エンティティを一意に識別するためのフィールドです。このフィールドには Int64 または VarChar の値のみを指定できます。次のコードスニペットは、プライマリフィールドを追加する方法を示しています。

python
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 では、1つのコレクションに最大4つのベクトルフィールドを追加できます。次のコードスニペットは、ベクトルフィールドを追加する方法を示しています。

python
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

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

  • BINARY_VECTOR

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

  • SPARSE_FLOAT_VECTOR

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

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

一般的に、スカラーフィールドは Zilliz Cloud クラスターに格納されたベクトル埋め込みのメタデータを保存するために使用します。メタデータフィルタリングを併用した ANN 検索を行うことで、検索結果の精度を高められます。Zilliz Cloud は、VarCharTEXTBooleanIntFloatDouble など、複数のスカラーフィールド型をサポートしています。

VarChar フィールドの追加

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

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

TEXT フィールドの追加

Milvus 3.0 以降では、TEXT フィールドを使用して、ドキュメントテキスト、文章、ログ、その他の長いテキストコンテンツを保存できます。VARCHAR とは異なり、TEXT フィールドでは max_length は不要です。TEXT フィールドの詳細については、TEXT Field を参照してください。

python
schema.add_field(
field_name="my_text",
datatype=DataType.TEXT,
)

数値フィールドの追加

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

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

Boolean フィールドの追加

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

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

複合フィールドの追加

Zilliz Cloud における複合フィールドとは、JSON フィールドのキーや Array フィールドのインデックスのように、より小さなサブフィールドに分割できるフィールドのことです。

JSON フィールドの追加

JSON フィールドは通常、半構造化 JSON データを保存するために使用します。JSON フィールドの詳細については、JSON Field Overview を参照してください。

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

Array フィールドの追加

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

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