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

Search Iterator

ANN Search では、1 回のクエリでリコールできるエンティティ数に最大制限があり、基本的な ANN Search だけでは大規模検索の要件を満たせない場合があります。topK が 16,384 を超える ANN Search リクエストでは、SearchIterator の使用を検討することを推奨します。このセクションでは、SearchIterator の使い方と関連する注意事項を紹介します。

概要

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

具体的には、SearchIterator は次のように使用できます。

  1. SearchIterator を作成し、1 回の検索リクエストごとに返すエンティティ数返すエンティティの総数 を設定します。

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

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

SearchIterator を作成する

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

python
from pymilvus import MilvusClient

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

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

iterator = client.search_iterator(
collection_name="iterator_collection"
data=query_vectors,
anns_field="vector",
batch_size=50,
output_fields=["color"],
limit=20000
)

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

SearchIterator を使用する

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

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

for res in result:
print(res)

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

Ctrl I