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:

  1. Buat SearchIterator dan tetapkan jumlah entitas yang akan dikembalikan per permintaan pencarian dan jumlah total entitas yang akan dikembalikan.

  2. Panggil metode next() dari SearchIterator dalam satu perulangan untuk mendapatkan hasil pencarian dengan cara berpigura.

  3. 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.

Coba Milvus yang Dikelola secara Gratis

Zilliz Cloud bebas masalah, didukung oleh Milvus dan 10x lebih cepat.

Mulai
Umpan balik

Apakah halaman ini bermanfaat?