검색 이터레이터
ANN 검색은 단일 쿼리에서 불러올 수 있는 엔티티 수에 최대 제한이 있으며, 기본 ANN 검색만으로는 대규모 검색 수요를 충족하지 못할 수 있습니다. topK가 16,384개를 초과하는 ANN 검색 요청의 경우 SearchIterator 사용을 고려하는 것이 좋습니다. 이 섹션에서는 SearchIterator를 사용하는 방법과 관련 고려 사항을 소개합니다.
개요
Search 요청은 검색 결과를 반환하는 반면 SearchIterator는 반복자를 반환합니다. 이 이터레이터의 다음() 메서드를 호출하여 검색 결과를 가져올 수 있습니다.
구체적으로 SearchIterator를 다음과 같이 사용할 수 있습니다.
SearchIterator를 생성하고 검색 요청당 반환할 엔티티 수와 반환할 총 엔티티 수를 설정합니다.
SearchIterator의 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가 준비되면 다음() 메서드를 호출하여 페이지 매김 방식으로 검색 결과를 가져올 수 있습니다.
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);
}
}
위의 코드 예제에서는 무한 루프를 생성하고 루프에서 다음() 메서드를 호출하여 검색 결과를 변수에 저장하고 다음() 이 아무것도 반환하지 않으면 반복기를 닫았습니다.