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

検索のためのデータモデル設計

検索エンジンとも呼ばれる情報検索システムは、Retrieval-augmented generation (RAG)、ビジュアル検索、商品レコメンデーションなど、さまざまな AI アプリケーションに不可欠です。これらのシステムの中核には、情報を整理し、インデックス化し、検索するための慎重に設計されたデータモデルがあります。

Zilliz Cloud では、collection schema を通じて検索データモデルを指定でき、非構造化データ、その dense または sparse vector 表現、および構造化メタデータを整理できます。テキスト、画像、その他のデータ型のいずれを扱う場合でも、このハンズオンガイドは、実践的に検索データモデルを設計するための重要な schema の概念を理解し、適用するのに役立ちます。

Kc3Cweq1AhAmMGbrVgRcTlTKnUf

データモデル

検索システムのデータモデル設計では、ビジネスニーズを分析し、情報を schema で表現されたデータモデルへと抽象化します。適切に定義された schema は、データモデルをビジネス目標に整合させ、データの一貫性とサービス品質を確保するうえで重要です。また、適切なデータ型と index を選択することは、ビジネス目標を経済的に達成するために重要です。

ビジネスニーズの分析

ビジネスニーズに効果的に対応するには、まずユーザーが実行する query の種類を分析し、最適な検索方法を決定することから始まります。

  • ユーザークエリ: ユーザーが実行すると想定される query の種類を特定します。これにより、schema が実際のユースケースをサポートし、検索パフォーマンスを最適化できるようになります。例として、以下が挙げられます。

    • 自然言語 query に一致するドキュメントの取得

    • 参照画像に類似する画像、またはテキスト記述に一致する画像の検索

    • 名前、カテゴリ、ブランドなどの属性による商品の検索

    • 構造化メタデータ(例: 公開日、タグ、評価)に基づくアイテムのフィルタリング

    • ハイブリッド query における複数条件の組み合わせ(例: ビジュアル検索で、画像とそのキャプションの両方の意味的類似性を考慮する)

  • 検索方法: ユーザーが実行する query の種類に合った適切な検索手法を選択します。異なる手法は異なる目的に対応し、多くの場合、より強力な結果を得るために組み合わせることができます。

    • セマンティック検索: dense vector の類似性を使用して意味の近いアイテムを見つけます。テキストや画像のような非構造化データに最適です。

    • 全文検索: キーワードマッチングでセマンティック検索を補完します。全文検索では語彙解析を利用して長い単語が断片化された token に分割されるのを防ぎ、検索時に特殊な用語を捉えることができます。

    • メタデータフィルタリング: vector 検索に加えて、日付範囲、カテゴリ、タグなどの条件を適用します。

ビジネス要件を検索データモデルに変換する

次のステップは、情報の中核となる構成要素とその検索方法を特定し、ビジネス要件を具体的なデータモデルに変換することです。

  • 保存する必要があるデータを定義します。たとえば、生コンテンツ(テキスト、画像、音声)、関連メタデータ(タイトル、タグ、著者情報)、コンテキスト属性(タイムスタンプ、ユーザー行動など)があります。

  • 各要素に適したデータ型と形式を決定します。たとえば、以下のようになります。

    • テキスト記述 → string

    • 画像またはドキュメントの embedding → dense または sparse vectors

    • カテゴリ、タグ、フラグ → string、array、bool

    • 価格や評価のような数値属性 → integer または float

    • 著者の詳細のような構造化情報 -> json

これらの要素を明確に定義することで、データの一貫性、正確な検索結果、そして下流のアプリケーションロジックとの統合の容易さが確保されます。

Schema 設計

Zilliz Cloud では、データモデルは collection schema を通じて表現されます。collection schema 内で適切な field を設計することは、効果的な検索を実現する鍵です。各 field は collection に保存される特定のデータ型を定義し、検索プロセスでそれぞれ異なる役割を果たします。大まかに言えば、Zilliz Cloud は vector fieldsscalar fields の 2 つの主要な field タイプをサポートしています。

これで、vectors と補助的な scalar fields を含めて、データモデルを field の schema にマッピングできます。各 field がデータモデルの属性に対応していることを確認し、特に vector type(dense または sparse)とその dimension に注意してください。

Vector Field

vector field は、テキスト、画像、音声などの非構造化データ型の embedding を保存します。これらの embedding は、データ型と使用する検索方法に応じて、dense、sparse、または binary のいずれかになります。通常、dense vectors はセマンティック検索に使用され、sparse vectors は全文検索や語彙マッチングにより適しています。binary vectors は、ストレージや計算リソースが限られている場合に有用です。collection には複数の vector field を含めることができ、マルチモーダルまたはハイブリッドな検索戦略を実現できます。このトピックの詳細なガイドについては、Multi-Vector Hybrid Search を参照してください。

Zilliz Cloud は、Dense Vector 用の FLOAT_VECTORSparse Vector 用の SPARSE_FLOAT_VECTOR、および Binary Vector 用の BINARY_VECTOR という vector データ型をサポートしています。

Scalar & Composite Fields

scalar field は、数値、文字列、日付など、一般にメタデータと呼ばれるプリミティブで構造化された値を保存します。これらの値は vector 検索結果とともに返すことができ、フィルタリングやソートに不可欠です。これにより、特定のカテゴリにドキュメントを限定したり、特定の時間範囲に絞ったりするなど、特定の属性に基づいて検索結果を絞り込むことができます。

Zilliz Cloud は、BOOLINT8/16/32/64FLOATDOUBLEVARCHAR などの scalar 型に加え、JSONARRAY のような composite 型もサポートしており、非 vector データの保存とフィルタリングに使用できます。これらの型により、検索操作の精度とカスタマイズ性が向上します。

Schema 設計で高度な機能を活用する

schema を設計する際には、サポートされているデータ型を使用してデータを field に単純にマッピングするだけでは不十分です。field 間の関係性や、設定に利用可能な戦略を十分に理解することが重要です。設計段階で重要な機能を念頭に置くことで、schema は当面のデータ処理要件を満たすだけでなく、将来のニーズに対してもスケーラブルかつ適応可能になります。これらの機能を慎重に統合することで、Zilliz Cloud の能力を最大限に引き出し、より広範なデータ戦略と目標を支える強固なデータアーキテクチャを構築できます。以下は、collection schema を作成する際の主要機能の概要です。

Primary Key

primary key field は schema の基本的な構成要素であり、collection 内の各エンティティを一意に識別します。primary key の定義は必須です。これは整数型または文字列型の scalar field であり、is_primary=True としてマークする必要があります。必要に応じて、primary key に auto_id を有効化できます。これにより、collection にデータが取り込まれるにつれて単調に増加する整数が自動的に割り当てられます。

詳細については、Primary Field & AutoID を参照してください。

Partitioning

検索を高速化するために、必要に応じて partitioning を有効にできます。partitioning 用に特定の scalar field を指定し、検索時にその field に基づくフィルタ条件を指定することで、検索範囲を関連する partition のみに効果的に限定できます。この方法により、検索対象の範囲が縮小されるため、検索処理の効率が大幅に向上します。

詳細については、Use Partition Key を参照してください。

Analyzer

analyzer はテキストデータを処理および変換するための重要なツールです。その主な機能は、生テキストを token に変換し、それらを indexing と検索のために構造化することです。具体的には、文字列を token 化し、ストップワードを除去し、各単語を語幹化して token にします。

詳細については、Analyzer Overview を参照してください。

Function

Zilliz Cloud では、schema の一部として組み込み関数を定義し、特定の field を自動的に導出できます。たとえば、VARCHAR field から sparse vector を生成する組み込みの BM25 関数を追加して、全文検索をサポートできます。これらの関数由来の field により、前処理が簡素化され、collection を自己完結型かつ query 可能な状態に保つことができます。

詳細については、Full Text Search を参照してください。

実世界の例

このセクションでは、上図に示したマルチメディアドキュメント検索アプリケーションの schema 設計とコード例を示します。この schema は、以下の field にマッピングされるデータを含む記事データセットを管理するように設計されています。

FieldData SourceUsed By Search MethodsPrimary KeyPartition KeyAnalyzerFunction Input/Output
article_id (INT64)auto_id を有効にして自動生成Query using GetYNNN
title (VARCHAR)記事タイトルText MatchNNYN
timestamp (INT32)公開日Filter by Partition KeyNYNN
text (VARCHAR)記事の生テキストMulti-Vector Hybrid SearchNNYinput
text_dense_vector (FLOAT_VECTOR)テキスト embedding モデルによって生成された dense vectorBasic Vector SearchNNNN
text_sparse_vector (SPARSE_FLOAT_VECTOR)組み込み BM25 関数によって自動生成された sparse vectorFull Text SearchNNNoutput

schema の詳細や、さまざまな型の field を追加するための詳細なガイダンスについては、Schema Explained を参照してください。

ステップ 1: schema を初期化する

まず、空の schema を作成する必要があります。このステップでは、データモデルを定義するための基礎構造を確立します。

python
from pymilvus import MilvusClient

schema = MilvusClient.create_schema()

ステップ 2: field を追加する

schema が作成されたら、次のステップはデータを構成する field を指定することです。各 field は、それぞれのデータ型と属性に関連付けられます。

python
from pymilvus import DataType

schema.add_field(field_name="article_id", datatype=DataType.INT64, is_primary=True, auto_id=True, description="article id")
schema.add_field(field_name="title", datatype=DataType.VARCHAR, enable_analyzer=True, enable_match=True, max_length=200, description="article title")
schema.add_field(field_name="timestamp", datatype=DataType.INT32, description="publish date")
schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=2000, enable_analyzer=True, description="article text content")
schema.add_field(field_name="text_dense_vector", datatype=DataType.FLOAT_VECTOR, dim=768, description="text dense vector")
schema.add_field(field_name="text_sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR, description="text sparse vector")

この例では、field に対して次の属性が指定されています。

  • Primary key: article_id は primary key として使用され、受信する entity に対する primary key の自動割り当てを有効にします。

  • Partition key: timestamp は partition key として割り当てられ、partition によるフィルタリングを可能にします。

  • Text analyzer: text analyzer は 2 つの文字列 field titletext に適用され、それぞれ text match と全文検索をサポートします。

ステップ 3: (任意)関数を追加する

データクエリ機能を強化するために、スキーマに関数を組み込むことができます。たとえば、特定のフィールドに関連する処理を行う関数を作成できます。

python
from pymilvus import Function, FunctionType

bm25_function = Function(
name="text_bm25",
input_field_names=["text"],
output_field_names=["text_sparse_vector"],
function_type=FunctionType.BM25,
)

schema.add_function(bm25_function)

この例では、スキーマに組み込みの BM25 関数を追加し、text フィールドを入力として使用して、生成されたスパースベクトルを text_sparse_vector フィールドに保存します。

次のステップ

Ctrl I