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

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

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

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

Kc3Cweq1AhAmMGbrVgRcTlTKnUf

Data Model

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

Analyzing Business Needs

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

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

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

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

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

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

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

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

    • Semantic search: dense vector の類似性を使用して意味が近いアイテムを見つける手法で、テキストや画像のような非構造化データに最適です。

    • Full-text search: semantic search をキーワードマッチングで補完します。Full-text search では字句解析を利用して長い単語が断片的なトークンに分割されるのを防ぎ、検索時に特殊な用語を把握できます。

    • Metadata filtering: vector search に加えて、日付範囲、カテゴリ、タグなどの条件を適用します。

Translates Business Requirements into a Search Data Model

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

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

  • 各要素に適したデータ型と形式を決定します。例:

    • テキスト説明 → string

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

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

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

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

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

Schema Design

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

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

Vector Field

vector field は、テキスト、画像、音声などの非構造化データ型の embeddings を保存します。これらの embeddings は、データ型と使用する検索方法に応じて、dense、sparse、または binary のいずれかになります。通常、dense vector は semantic search に使用され、sparse vector は full-text または lexical matching により適しています。binary vector は、ストレージと計算リソースが限られている場合に有用です。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 search の結果とともに返すことができ、フィルタリングやソートに不可欠です。特定のカテゴリのドキュメントや定義済みの期間に結果を限定するなど、特定の属性に基づいて検索結果を絞り込むことができます。

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

Leverage Advanced Features in Schema Design

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

Primary Key

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

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

Partitioning

検索を高速化するために、オプションで partitioning を有効にできます。partitioning 用に特定の scalar field を指定し、検索時にこの field に基づくフィルタ条件を指定することで、検索範囲を関連する partitions のみに効果的に限定できます。この方法により、検索対象領域が縮小され、検索操作の効率が大幅に向上します。

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

Analyzer

analyzer は、テキストデータを処理および変換するための重要なツールです。その主な機能は、生のテキストをトークンに変換し、インデックス作成と検索のために構造化することです。具体的には、文字列をトークン化し、stop words を除去し、個々の単語を stem 化してトークンにします。

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

Function

Zilliz Cloud では、schema の一部として組み込み function を定義し、特定の field を自動的に導出できます。たとえば、VARCHAR field から sparse vector を生成して full-text search をサポートする組み込み BM25 function を追加できます。これらの function によって導出される field は、前処理を簡素化し、collection が自己完結型でクエリ可能な状態に保たれるようにします。

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

A Real World Example

このセクションでは、上の図に示したマルチメディア文書検索アプリケーションの 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)テキスト埋め込みモデルによって生成された dense vectorBasic Vector SearchNNNN
text_sparse_vector (SPARSE_FLOAT_VECTOR)組み込み BM25 function によって自動生成された sparse vectorFull Text SearchNNNoutput

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

Step 1: Initialize schema

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

python
from pymilvus import MilvusClient

schema = MilvusClient.create_schema()

Step 2: Add fields

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 として使用され、受信エンティティに対する primary key の自動割り当てを有効にします。

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

  • Text analyzer: text analyzer は 2 つの string field titletext に適用され、それぞれ text match と full-text search をサポートします。

ステップ 3: (オプション)関数を追加する

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

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)

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

次のステップ

Ctrl I