milvus-logo
LFAI
홈페이지
  • 사용자 가이드

검색 이터레이터

ANN 검색은 단일 쿼리에서 불러올 수 있는 엔티티 수에 최대 제한이 있으며, 기본 ANN 검색만으로는 대규모 검색 수요를 충족하지 못할 수 있습니다. topK가 16,384개를 초과하는 ANN 검색 요청의 경우 SearchIterator 사용을 고려하는 것이 좋습니다. 이 섹션에서는 SearchIterator를 사용하는 방법과 관련 고려 사항을 소개합니다.

개요

Search 요청은 검색 결과를 반환하는 반면 SearchIterator는 반복자를 반환합니다. 이 이터레이터의 다음() 메서드를 호출하여 검색 결과를 가져올 수 있습니다.

구체적으로 SearchIterator를 다음과 같이 사용할 수 있습니다.

  1. SearchIterator를 생성하고 검색 요청당 반환할 엔티티 수와 반환할 총 엔티티 수를 설정합니다.

  2. SearchIterator의 next() 메서드를 루프에서 호출하여 페이지 매김 방식으로 검색 결과를 가져옵니다.

  3. 다음() 메서드가 빈 결과를 반환하면 이터레이터의 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가 준비되면 다음() 메서드를 호출하여 페이지 매김 방식으로 검색 결과를 가져올 수 있습니다.

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);
    }
}

위의 코드 예제에서는 무한 루프를 생성하고 루프에서 다음() 메서드를 호출하여 검색 결과를 변수에 저장하고 다음() 이 아무것도 반환하지 않으면 반복기를 닫았습니다.

번역DeepLogo

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
피드백

이 페이지가 도움이 되었나요?