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
Potongan kode berikut ini mendemonstrasikan 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}},
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
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 dipaginasi.
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
Pada contoh kode di atas, Anda telah membuat perulangan tak terbatas dan memanggil metode next() di dalam perulangan untuk menyimpan hasil pencarian di dalam sebuah variabel dan menutup perulangan ketika next() tidak menghasilkan apa-apa.