Iterator Pencarian
Pencarian ANN memiliki batas maksimum jumlah entitas yang dapat dipanggil dalam satu kueri, dan hanya dengan menggunakan Pencarian ANN dasar mungkin tidak dapat memenuhi permintaan pencarian berskala besar. Untuk permintaan Pencarian ANN di mana topK melebihi 16.384, disarankan untuk mempertimbangkan menggunakan SearchIterator. Bagian ini akan memperkenalkan cara menggunakan SearchIterator dan pertimbangan terkait.
Ikhtisar
Permintaan Pencarian mengembalikan hasil pencarian, sementara SearchIterator mengembalikan iterator. Anda bisa memanggil metode next() dari iterator ini untuk mendapatkan hasil pencarian.
Secara khusus, Anda dapat menggunakan SearchIterator sebagai berikut.
Buat SearchIterator dan tetapkan jumlah entitas yang akan dikembalikan per permintaan pencarian dan jumlah total entitas yang akan dikembalikan.
Panggil metode next() dari SearchIterator dalam satu perulangan untuk mendapatkan hasil pencarian dengan cara berpigura.
Panggil metode close() dari iterator untuk mengakhiri perulangan jika metode next() mengembalikan hasil kosong.
Membuat SearchIterator
Cuplikan kode berikut ini menunjukkan cara membuat 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());
Pada contoh di atas, Anda telah mengatur jumlah entitas yang akan dikembalikan per pencarian(batch_size/batchSize) menjadi 50, dan jumlah total entitas yang akan dikembalikan(topK) menjadi 20.000.
Menggunakan SearchIterator
Setelah SearchIterator siap, Anda dapat memanggil metode next() untuk mendapatkan hasil pencarian dengan cara yang berurutan.
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);
}
}
Pada contoh kode di atas, Anda telah membuat perulangan tak terbatas dan memanggil metode next() di dalam perulangan untuk menyimpan hasil pencarian di sebuah variabel dan menutup iterator ketika next() tidak menghasilkan apa-apa.