搜尋迭代器

ANN Search 對於單一查詢可回收的實體數量有最大限制,單純使用基本 ANN Search 可能無法滿足大規模檢索的需求。對於 topK 超過 16,384 的 ANN Search 請求,建議考慮使用 SearchIterator。本節將介紹如何使用 SearchIterator 及相關注意事項。

概述

Search 請求會返回搜尋結果,而 SearchIterator 會返回一個迭代器。您可以呼叫這個迭代器的next()方法來取得搜尋結果。

具體來說,您可以如下使用 SearchIterator:

  1. 建立一個 SearchIterator,並設定每個搜尋要求要傳回的實體數量,以及要傳回的實體總數

  2. 在循環中呼叫 SearchIterator 的next()方法,以分頁方式取得搜尋結果。

  3. 如果next()方法返回空結果,則呼叫迭代器的close()方法結束循環。

建立 SearchIterator

以下程式碼片段示範如何建立 SearchIterator。

from pymilvus import connections, Collection

connections.connect(
    uri="http://localhost:19530",
    token="root:Milvus"
)

# 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
)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.orm.iterator.SearchIterator;
import io.milvus.v2.common.IndexParam.MetricType;
import io.milvus.v2.service.vector.request.data.FloatVec;

import java.util.*;

MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
        .uri("http://localhost:19530")
        .token("root:Milvus")
        .build());

FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});
SearchIterator searchIterator = client.searchIterator(SearchIteratorReq.builder()
        .collectionName("iterator_collection")
        .vectors(Collections.singletonList(queryVector))
        .vectorFieldName("vector")
        .batchSize(500L)
        .outputFields(Lists.newArrayList("color"))
        .topK(20000)
        .metricType(IndexParam.MetricType.COSINE)
        .build());
// go
import { MilvusClient } from '@zilliz/milvus2-sdk-node';

const milvusClient = new MilvusClient({
  address: 'http://localhost:19530',
  token: 'root:Milvus',
});

const queryVectors = [
[0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592],
];
const collectionName = 'iterator_collection';

const iterator = milvusClient.searchIterator({
    collection_name: collectionName,
    vectors: queryVectors,
    anns_field: 'vector',
    params: { metric_type: 'L2', params: { nprobe: 16 } },
    batch_size: 50,
    output_fields: ['color'],
    limit: 20000,
});

# restful

在上述範例中,您將每次搜尋要返回的實體數量(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())
import io.milvus.response.QueryResultsWrapper;

while (true) {
    List<QueryResultsWrapper.RowRecord> res = searchIterator.next();
    if (res.isEmpty()) {
        searchIterator.close();
        break;
    }

    for (QueryResultsWrapper.RowRecord record : res) {
        System.out.println(record);
    }
}
// go
for await (const result of iterator) {
    console.log(result);
}
# restful

在上面的程式碼範例中,您建立了一個無限循環,並在循環中呼叫next()方法,將搜尋結果儲存在變數中,並在next()沒有回傳任何結果時關閉迭代器。

免費嘗試托管的 Milvus

Zilliz Cloud 無縫接入,由 Milvus 提供動力,速度提升 10 倍。

開始使用
反饋

這個頁面有幫助嗎?