🚀 免費嘗試 Zilliz Cloud,完全托管的 Milvus,體驗速度提升 10 倍!立即嘗試

milvus-logo
LFAI
主頁
  • 使用者指南
  • Home
  • Docs
  • 使用者指南

  • 搜尋與重新排名

  • 搜尋迭代器

搜尋迭代器

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}},
    # highlight-next-line
    batch_size=50,
    output_fields=["color"],
    # highlight-next-line
    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());

在上述範例中,您將每次搜尋要返回的實體數量(batch_size/batchSize) 設定為 50,而要返回的實體總數(topK) 設定為 20,000。

使用 SearchIterator

一旦 SearchIterator 準備就緒,您就可以呼叫它的 next() 方法,以分頁的方式取得搜尋結果。

results = []

while True:
    # highlight-next-line
    result = iterator.next()
    if not result:
        # highlight-next-line
        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);
    }
}

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

免費嘗試托管的 Milvus

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

開始使用
反饋

這個頁面有幫助嗎?