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] 」は、COSINE 、IP 、または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_ANY 、MATCH_ALL 、MATCH_LEAST 、MATCH_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 の制限事項を確認してください。
次の手順
スキーマを設計するには、「StructArray フィールドの作成」を参照してください。
データを準備するには、「StructArrayフィールドへのデータ挿入」を参照してください。
インデックスを選択するには、「StructArrayフィールドへのインデックス設定」を参照してください。
StructArrayのベクトルサブフィールドを検索するには、「StructArray を使用した基本的なベクトル検索」から始めてください。
StructArrayのスカラーサブフィールドをフィルタリングするには、「StructArray演算子」および「StructArrayを使用したフィルタ検索」を参照してください。