StructArray の概要

StructArrayは、1つのエンティティが構造化された要素の順序付きリストを格納する必要がある場合に使用します。例としては、多数のチャンクを含む1つのドキュメント、多数のビジュアルパッチを含む1つのページ、または多数のクリップを含む1つの動画などが挙げられます。StructArrayは、これらの要素を親エンティティ内に保持しつつ、各要素内のフィールドに対するベクトル検索やスカラーフィルタリングを可能にします。

StructArray とは?

StructArray(構造体の配列とも呼ばれる)は、各エンティティ内に順序付けられた Struct 要素のセットを格納します。配列内のすべての Struct 要素は、同じスキーマに従います。Struct 要素には、スカラーサブフィールド、ベクトルサブフィールド、あるいはその両方を含めることができます。

たとえば、コレクションは1つの記事をエンティティとして格納し、そのチャンクを「chunks 」という名前のStructArrayフィールドに格納できます。各チャンクには、テキスト、セクションのメタデータ、品質スコア、および1つ以上のベクトル埋め込みを含めることができます。

{
  "doc_id": 1,
  "title": "Vector search tuning guide",
  "category": "search",
  "title_vector": [0.10, 0.20, 0.30, 0.40],
  "chunks": [
    {
      "text": "Use HNSW efSearch to trade recall for latency.",
      "section": "index",
      "page": 1,
      "quality_score": 0.92,
      "has_code": true,
      "emb_list_vector": [0.11, 0.21, 0.31, 0.41],
      "emb": [0.12, 0.20, 0.33, 0.39]
    },
    {
      "text": "Range search returns vectors within a distance boundary.",
      "section": "search",
      "page": 2,
      "quality_score": 0.86,
      "has_code": false,
      "emb_list_vector": [0.18, 0.23, 0.29, 0.36],
      "emb": [0.19, 0.24, 0.30, 0.37]
    }
  ]
}

この例にある2つのベクトルサブフィールドは、2つの検索の観点から見た同じチャンクを表しています。「chunks[emb_list_vector] 」は、MAX_SIM* メトリクスを使用した EmbeddingList 検索を目的としており、「chunks[emb] 」は、COSINEIP 、またはL2 などの通常のベクトルメトリクスを使用した要素レベルの検索を目的としています。

StructArrayの使用場面

返したい自然単位が、検索やフィルタリングに用いたい自然単位よりも大きい場合に、StructArrayを使用します。

使用例StructArrayが役立つ理由典型的な StructArray フィールド
ドキュメントの検索1つのドキュメントをエンティティとして保存しつつ、そのチャンク全体を横断して検索します。chunks
遅延インタラクションによる検索ドキュメントやページを埋め込みリストとして保存し、MAX_SIM* を使用してスコアを算出します。chunks[emb_list_vector] またはpatches[emb]
要素レベルの検索最も関連性の高いチャンク、クリップ、パッチ、またはオブザベーションを、その配列オフセットを含めて返す。chunks[emb]
構造化フィルタリングsection、score、page、flags など、Struct 要素内のスカラーサブフィールドでフィルタリングします。chunks[section],chunks[quality_score]
重複する親結果の削減各子要素を個別の行として保存するのではなく、同じ親エンティティの下に子要素を保持します。chunks,clips,patches

決定マトリックス

適切な StructArray パスを選択するには、以下のマトリックスを使用してください。

目標推奨パス結果の粒度ここから始めましょう
1 つの親オブジェクトと、多数の構造化された子オブジェクトをモデル化する場合。StructArrayフィールドを作成します。エンティティには順序付きStruct要素が含まれます。StructArrayフィールドの作成
ネストされた子データを含む親レコードを挿入します。StructArrayフィールドがStructオブジェクトのリストであるエンティティを挿入します。エンティティレベルの挿入。StructArrayフィールドへのデータの挿入
ColBERT、ColPali、またはドキュメントレベルのレイトインタラクション検索を実行します。MAX_SIM* インデックスを使用したEmbeddingList検索を実行します。エンティティレベル。Embedding Lists を使用した検索
個々のチャンク、クリップ、またはパッチを検索します。通常のベクトルメトリックを使用した要素レベルの検索を行います。Struct 要素レベル。利用可能な場合はオフセットを含みます。StructArray を使用した基本的なベクトル検索
スカラー条件に一致する要素に限定して、要素レベルのベクトル検索を実行します。element_filter を使用します。要素レベルのフィルタリング。結果の形状は検索タイプによって異なります。StructArray を使用したフィルタリング検索
条件を満たす Struct 要素の数に基づいてエンティティを選択します。MATCH_ANYMATCH_ALLMATCH_LEASTMATCH_MOST 、またはMATCH_EXACT を使用します。エンティティレベル。StructArray 演算子
StructArray ベクトルのサブフィールドに対して、スコアまたは距離の境界を使用します。要素レベルの範囲検索を使用します。Struct 要素レベル。StructArray を使用した範囲検索
要素レベルの検索後、親エンティティごとに最大 1 件の結果を返します。主キーによるグループ化検索を使用します。グループ化後のエンティティレベル。StructArray を使用したグループ化検索
StructArray要素検索を別のベクトルフィールドと組み合わせる。StructArrayのベクトルサブフィールドを対象とする1つのAnnSearchRequestを使用したハイブリッド検索を使用します。要素レベルのサブ検索、エンティティレベルの再ランク付け。StructArray を使用したハイブリッド検索

2つの検索モデルを理解する

### EmbeddingList検索 EmbeddingList検索では、StructArrayのベクトルサブフィールド内のベクトルを、親エンティティの単一の埋め込みリストとして扱います。クエリも埋め込みリストです。Milvusは、MAX_SIM* メトリックを使用して、クエリの埋め込みリストと保存された埋め込みリストを比較し、一致するエンティティを返します。- クエリデータ:埋め込みリスト。 - メトリックファミリー:MAX_SIM* 。 - 結果の粒度:エンティティレベル。 - 最適な用途:ドキュメントレベルまたはページレベルでの後期インタラクション検索。### 要素レベル検索要素レベル検索では、各Struct要素を独立したベクトル検索候補として扱います。各ヒットはStructArrayフィールド内の照合された要素を表し、グループ化されていない結果では要素のオフセットが明らかになる場合があります。- クエリデータ:通常のベクトル。- メトリックファミリー:通常のベクトルメトリック。 - 結果の粒度:Struct要素レベル。 - 最適な用途:チャンクレベル、クリップレベル、またはパッチレベルの検索。

警告

コレクションで EmbeddingList 検索と要素レベル検索の両方が必要な場合は、2 つの別々のベクトルサブフィールドを使用してください。ベクトルフィールドまたはベクトルサブフィールドは 1 つのインデックスのみを受け付け、これら 2 つの検索モードでは異なるメトリックファミリーが必要です。

ドキュメントマップ

StructArrayのドキュメントは、モデリングページと検索ページに分かれています。モデリングページを使用してデータを定義・準備し、検索ページを使用して適切な検索およびフィルタリングの挙動を選択してください。

エリアページ用途
モデリングStructArrayフィールドの作成Structスキーマを定義し、StructArrayフィールドを追加します。
モデリングStructArray フィールドへのデータの挿入ネストされたStructArrayデータを準備し、挿入します。
モデリングStructArray フィールドへのインデックス設定StructArrayのサブフィールドに対してベクトルインデックスおよびスカラーインデックスを作成します。
参照StructArray の制限スキーマ、データ型、インデックス、検索、フィルタ、およびバージョンの制限を確認します。
検索StructArray を使用した基本的なベクトル検索EmbeddingList 検索と要素レベルのベクトル検索を比較します。
検索StructArray を使用した範囲検索StructArrayのベクトルサブフィールドで範囲制約を使用する。
検索StructArray を使用したグループ化検索要素レベルの検索結果を主キーでグループ化します。
検索StructArray を使用したハイブリッド検索StructArrayによる要素レベルの検索を、他のベクトル検索と組み合わせます。
検索StructArray を使用したフィルタ検索検索、クエリ、およびハイブリッド検索でStructArrayフィルターを使用します。
検索埋め込みリストを用いた検索StructArray を使用して、ColBERT や ColPali スタイルの検索システムを構築します。
フィルタStructArray演算子element_filter およびMATCH_* 演算子のリファレンス構文。

最初に確認すべき主な制限事項

  • Struct は、Array フィールドの要素型として使用できます。トップレベルのコレクションフィールドとしては使用されません。

  • 同じ StructArray フィールド内のすべての Struct 要素は、1 つの事前定義されたスキーマを共有します。

  • Vector サブフィールドにはインデックスが必要です。EmbeddingList 検索ではMAX_SIM* メトリクスが使用されますが、要素レベルの検索では通常のベクトルメトリクスが使用されます。

  • element_filter また、MATCH_* は、StructArrayフィールド内のスカラーサブフィールド向けです。$[subfield] は、これらの演算子内でのみ使用してください。

  • 一部の検索の組み合わせは、バージョン制限やモード固有の制限があります。範囲検索、グループ化検索、ハイブリッド検索、NULL 許容フィールド、または動的に追加されたフィールドを利用する前に、StructArray の制限事項を確認してください。

次の手順

  1. スキーマを設計するには、「StructArray フィールドの作成」を参照してください。

  2. データを準備するには、「StructArrayフィールドへのデータ挿入」を参照してください。

  3. インデックスを選択するには、「StructArrayフィールドへのインデックス設定」を参照してください。

  4. StructArrayのベクトルサブフィールドを検索するには、「StructArray を使用した基本的なベクトル検索」から始めてください。

  5. StructArrayのスカラーサブフィールドをフィルタリングするには、「StructArray演算子」および「StructArrayを使用したフィルタ検索」を参照してください。

翻訳DeepL

マネージド Milvus を無料で試す

Zilliz Cloud は手間いらず、Milvus を基盤に 10 倍高速です。

始める
フィードバック

このページは役に立ちましたか ?