milvus-logo
LFAI
Home
  • Benutzerhandbuch

Such-Iterator

Die ANN-Suche hat eine Höchstgrenze für die Anzahl der Entitäten, die in einer einzigen Anfrage abgerufen werden können, und die Verwendung der einfachen ANN-Suche erfüllt möglicherweise nicht die Anforderungen einer umfangreichen Abfrage. Für ANN-Suchanfragen, bei denen topK 16.384 überschreitet, ist es ratsam, den SearchIterator zu verwenden. In diesem Abschnitt werden die Verwendung des SearchIterators und damit verbundene Überlegungen vorgestellt.

Überblick

Eine Suchanfrage gibt Suchergebnisse zurück, während ein SearchIterator einen Iterator zurückgibt. Sie können die next() -Methode dieses Iterators aufrufen, um die Suchergebnisse zu erhalten.

Im Einzelnen können Sie die SearchIterators wie folgt verwenden.

  1. Erstellen Sie einen SearchIterator und legen Sie die Anzahl der Entitäten fest , die pro Suchanfrage zurückgegeben werden sollen, sowie die Gesamtzahl der Entitäten, die zurückgegeben werden sollen.

  2. Rufen Sie die next() -Methode des SearchIterators in einer Schleife auf, um das Suchergebnis in einer paginierten Weise zu erhalten.

  3. Rufen Sie die close() -Methode des Iterators auf, um die Schleife zu beenden, wenn die next() -Methode ein leeres Ergebnis liefert.

SearchIterator erstellen

Der folgende Codeschnipsel zeigt, wie man einen SearchIterator erstellt.

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

In den obigen Beispielen haben Sie die Anzahl der Entitäten, die pro Suche zurückgegeben werden sollen(batch_size/batchSize), auf 50 und die Gesamtzahl der zurückzugebenden Entitäten(topK) auf 20.000 gesetzt.

SearchIterator verwenden

Sobald der SearchIterator fertig ist, können Sie seine next()-Methode aufrufen, um die Suchergebnisse in einer paginierten Weise zu erhalten.

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

In den obigen Codebeispielen haben Sie eine Endlosschleife erstellt und die next() -Methode in der Schleife aufgerufen, um die Suchergebnisse in einer Variablen zu speichern und den Iterator zu schließen, wenn next() nichts zurückgibt.

Übersetzt vonDeepL

Try Managed Milvus for Free

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

Get Started
Feedback

War diese Seite hilfreich?