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

StructArray による基本的なベクトル検索

このページでは、StructArray フィールド内のベクトルサブフィールドに対してベクトル検索を実行する方法を説明します。StructArray は、2 つの基本的なベクトル検索モードをサポートしています。1 つは EmbeddingList 検索で、各エンティティに格納されている埋め込みリストをスコアリングします。もう 1 つは要素レベルの検索で、各 Struct 要素を個別に検索します。

このページでは、StructArray フィールドを作成する の tech_articles コレクションを使用します。このコレクションには、chunks という名前の StructArray フィールドがあります。各チャンクには、テキスト、スカラーメタデータ、EmbeddingList 検索用のインデックスを持つ emb_list_vector という名前のベクトルサブフィールド、および要素レベルの検索用のインデックスを持つ emb という名前のベクトルサブフィールドが含まれています。

事前準備​

コレクションのスキーマ、データ、インデックスが事前に準備されていることを確認してください。サンプルのベクトルは 4 次元です。各検索例では、クライアントを初期化し、検索を実行する前に tech_articles がロードされるのを待機します。cURL の場合は、ロード状態のレスポンスを確認するために jq をインストールしてください。

要件準備場所
chunks などの StructArray フィールドを作成します。StructArray フィールドを作成する
chunks フィールドに Struct オブジェクトを含むエンティティを挿入します。StructArray フィールドにデータを挿入する
MAX_SIM* インデックスを EmbeddingList 検索用に chunks[emb_list_vector] に作成します。StructArray フィールドにインデックスを作成する
要素レベルの検索用に chunks[emb] に通常のベクトルメトリクスのインデックスを作成します。StructArray フィールドにインデックスを作成する
📘Notes

警告

ベクトルフィールドまたはベクトルサブフィールドに設定できるインデックスは 1 つだけです。EmbeddingList 検索と要素レベルの検索の両方が必要な場合は、2 つの別々のベクトルサブフィールドを作成してください。このページでは、chunks[emb_list_vector] は EmbeddingList 検索用にインデックスが作成され、chunks[emb] は要素レベルの検索用にインデックスが作成されています。

検索モードを選択する​

項目EmbeddingList 検索要素レベルの検索
対象サブフィールドchunks[emb_list_vector]chunks[emb]
クエリデータ1 つ以上のベクトルを含む埋め込みリスト。通常のベクトル。
メトリクスファミリーMAX_SIM*(MAX_SIM_COSINE など)。COSINE、IP、L2 などの通常のベクトルメトリクス。
1 件のヒットが表すものStructArray のベクトルサブフィールドがクエリの埋め込みリストに類似している、一致したエンティティ。StructArray フィールド内の一致した Struct 要素。
結果の粒度エンティティレベル。Struct 要素レベル。
オフセット該当しません。返される際の、一致した Struct 要素の 0 から始まる位置を示します。
一般的な用途ColBERT、ColPali、その他の late-interaction 検索パターン。チャンクレベル、パッセージレベル、クリップレベル、パッチレベル、またはファクトレベルの検索。

クエリ自体が複数のベクトルを含み、対象の StructArray ベクトルサブフィールドが MAX_SIM* メトリクスでインデックス付けされている場合は、EmbeddingList 検索を使用します。結果はエンティティレベルの一致となります。

python
from pymilvus import MilvusClient
from pymilvus.client.embedding_list import EmbeddingList

client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN",
)

client.load_collection(collection_name="tech_articles")

query = EmbeddingList()
query.add([0.12, 0.21, 0.32, 0.44])
query.add([0.18, 0.23, 0.29, 0.36])

results = client.search(
collection_name="tech_articles",
data=[query],
anns_field="chunks[emb_list_vector]",
limit=3,
output_fields=[
"doc_id",
"title",
"category",
"chunks[text]",
"chunks[section]",
],
)

for hits in results:
for hit in hits:
print(hit["doc_id"], hit["distance"], hit["entity"])

この検索モードでは、limit はクエリごとに返されるエンティティの数を制御します。出力には StructArray サブフィールドを含めることができますが、ヒット自体は特定の Struct 要素ではなく、一致した親エンティティを表します。

📘Notes

ColBERT または ColPali スタイルの完全なチュートリアルについては、Embedding List を使用した検索 を参照してください。このページでは、StructArray の基本的な検索動作についてのみ説明します。

各 Struct 要素を個別にベクトル検索に参加させる場合は、要素レベルの検索を使用します。クエリは通常のベクトルであり、対象のベクトルサブフィールドは通常のベクトルメトリクスでインデックス付けされている必要があります。

python
from pymilvus import MilvusClient

client = MilvusClient(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN",
)

client.load_collection(collection_name="tech_articles")

query_vector = [0.19, 0.24, 0.30, 0.37]

results = client.search(
collection_name="tech_articles",
data=[query_vector],
anns_field="chunks[emb]",
limit=5,
output_fields=[
"doc_id",
"title",
"chunks[text]",
"chunks[section]",
"chunks[page]",
"chunks[quality_score]",
],
)

for hits in results:
for hit in hits:
print(
"doc_id:", hit["doc_id"],
"distance:", hit["distance"],
"offset:", hit.get("offset"),
"entity:", hit["entity"],
)

要素レベルの検索では、各ヒットが一致した Struct 要素を表します。offset 値は、StructArray フィールド内におけるその要素の 0 から始まる位置です。複数の Struct 要素がクエリに一致する場合、同じエンティティが複数回現れることがあります。limit 値は、一意の親エンティティではなく、要素のヒットに適用されます。

結果を解釈する​

結果項目EmbeddingList 検索要素レベルの検索
主キー(このスキーマの doc_id)一致したエンティティの主キー。一致した Struct 要素を含むエンティティの主キー。
distance またはスコアクエリの埋め込みリストと格納されている埋め込みリストの間のスコアまたは距離。クエリベクトルと一致した Struct 要素のベクトルの間のスコアまたは距離。
offset該当しません。返される際の、一致した Struct 要素の 0 から始まる位置。
主キーの重複結果はエンティティレベルであるため、単一のクエリでは想定されません。同じエンティティ内の複数の Struct 要素が一致する可能性があるため、発生する可能性があります。
要求された StructArray 出力フィールド一致したエンティティから返されます。対象の API と SDK がサポートする要素レベルのヒット形式で返されます。

Python の例では PyMilvus 3.0.2 を使用し、主キーにはスキーマ名 doc_id でアクセスします。結果のアクセサーは SDK によって異なります。Go client/v3.0.0 では、ResultSet に要素のオフセットが公開されません。その他の例では、SDK がサポートする結果インターフェースを通じてのみオフセットを表示します。

よくある間違い​

  • chunks.emb を必須のサブフィールドパス構文 chunks[emb] の代わりに使用しています。

  • 通常のベクトルメトリクスでインデックス付けされたベクトルサブフィールドに対して EmbeddingList クエリを使用しています。

  • MAX_SIM* メトリクスでインデックス付けされたベクトルサブフィールドに対して通常のベクトルクエリを使用しています。

  • 要素レベルの検索の limit が、その数だけ一意の親エンティティを返すことを期待しています。実際には要素のヒットを返します。

  • EmbeddingList 検索が特定の要素オフセットを返すことを期待しています。実際にはエンティティレベルの一致を返します。

  • 両方の検索モードで 1 つのベクトルサブフィールドを再利用しています。各ベクトルサブフィールドに設定できるインデックスは 1 つだけなので、別々のベクトルサブフィールドを使用してください。

次のステップ​

  1. スカラー条件で要素レベルの検索を絞り込むには、StructArray でのフィルター検索 を参照してください。

  2. スコアまたは距離の境界で検索するには、StructArray での範囲検索 を参照してください。

  3. 要素レベルの検索後に親エンティティごとに最大 1 件の結果を返すには、StructArray でのグループ化検索 を参照してください。

  4. StructArray 検索を他のベクトル検索と組み合わせるには、StructArray でのハイブリッド検索 を参照してください。

  5. サポートされているデータ型、メトリクス、フィルター、バージョン固有の制限を確認するには、StructArray の制限 を参照してください。