メインコンテンツまでスキップ
バージョン: User Guides (BYOC)

検索イテレータ

ANN検索には、1つのクエリで呼び出すことができるエンティティの最大数に制限があり、基本的なANN検索だけでは大規模な検索の要求を満たすことができない場合があります。topKが16,384を超えるANN検索リクエストの場合は、SearchIteratorの使用を検討することをお勧めします。このセクションでは、SearchIteratorの使用方法と関連する考慮事項を紹介します。

概要について

Searchリクエストは検索結果を返し、SearchIteratorはイテレータを返します。このイテレータの**next()**メソッドを呼び出すことで、検索結果を取得できます。

具体的には、以下のようにSearchIteratorsを使用できます。

  1. SearchIteratorを作成し、検索要求ごとに返すエンティティの数返すエンティティの総数を設定します。

  2. SearchIteratorの**next()**メソッドをループで呼び出して、ページ分割された検索結果を取得します。

  3. イテレータの**close()**メソッドが空の結果を返した場合、**next()**メソッドを呼び出してループを終了します。

SearchIteratorの作成

次のコードスニペットは、SearchIteratorを作成する方法を示しています。

from pymilvus import connections, Collection

connections.connect(
uri="YOUR_CLUSTER_ENDPOINT",
token="YOUR_CLUSTER_TOKEN"
)

# create iterator
query_vectors = [
[0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]]

collection = Collection("iterator_collection")

iterator = collection.search_iterator(
data=query_vectors,
anns_field="vector",
param={"metric_type": "L2", "params": {"nprobe": 16}},
batch_size=50,
output_fields=["color"],
limit=20000
)

上記の例では、検索ごとに返すエンティティの数(batch_size/batchSize)50に設定し、返すエンティティの総数(topK)を20,000に設定しています。

SearchIteratorを使う

SearchIteratorの準備ができたら、そのnext()メソッドを呼び出して、ページ分割された検索結果を取得できます。

results = []

while True:
result = iterator.next()
if not result:
iterator.close()
break

for hit in result:
results.append(hit.to_dict())

上記のコード例では、無限ループを作成し、ループ内で**next()**メソッドを呼び出して検索結果を変数に格納し、**next()**が何も返さない場合にイテレータを閉じました。