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

StructArray を使用した基本ベクトル検索

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

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

事前準備​

コレクションのスキーマ、データ、インデックスがすでに準備されていることを確認してください。

要件準備する場所
chunks などの StructArray フィールドを作成します。Create a StructArray Field
chunks フィールドに Struct オブジェクトが含まれるエンティティを挿入します。Insert Data into StructArray Fields
EmbeddingList 検索用に chunks[emb_list_vector] の MAX_SIM* インデックスを作成します。Index StructArray Fields
要素レベルの検索用に chunks[emb] の通常のベクトルメトリクスインデックスを作成します。Index StructArray Fields
Warning

ベクトルフィールドまたはベクトルサブフィールドが受け入れるインデックスは 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 などのレイトインタラクション方式の検索パターンチャンクレベル、パッセージレベル、クリップレベル、パッチレベル、またはファクトレベルの検索

クエリ自体に複数のベクトルが含まれ、対象の 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",
)

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.id, hit.distance, hit.entity)

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

Notes

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

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

python
from pymilvus import MilvusClient

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

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.id,
"distance:", hit.distance,
"offset:", hit.get("offset"),
"entity:", hit.entity,
)

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

結果を解釈する​

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

よくある誤り​

  • 必須のサブフィールドパス構文 chunks[emb] ではなく、chunks.emb を使用している。

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

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

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

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

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

次のステップ​

  1. スカラー条件で要素レベルの検索を制限するには、Filtered Search with StructArray を参照してください。

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

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

  4. StructArray 検索を他のベクトル検索と組み合わせるには、Hybrid Search with StructArray を参照してください。

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