milvus-logo
LFAI
Home
  • Guide de l'utilisateur

Itérateur de recherche

La recherche ANN a une limite maximale sur le nombre d'entités qui peuvent être rappelées dans une seule requête, et l'utilisation simple de la recherche ANN de base peut ne pas répondre aux exigences de la recherche à grande échelle. Pour les requêtes de recherche ANN dont le topK dépasse 16 384, il est conseillé d'utiliser l'itérateur de recherche. Cette section présente l'utilisation du SearchIterator et les considérations qui s'y rapportent.

Vue d'ensemble

Une requête Search renvoie des résultats de recherche, tandis qu'un SearchIterator renvoie un itérateur. Vous pouvez appeler la méthode next() de cet itérateur pour obtenir les résultats de la recherche.

Plus précisément, vous pouvez utiliser les itérateurs de recherche de la manière suivante.

  1. Créez un SearchIterator et définissez le nombre d'entités à renvoyer par demande de recherche et le nombre total d'entités à renvoyer.

  2. Appelez la méthode next() du SearchIterator dans une boucle pour obtenir les résultats de la recherche de manière paginée.

  3. Appelez la méthode close() de l'itérateur pour terminer la boucle si la méthode next() renvoie un résultat vide.

Créer un SearchIterator

L'extrait de code suivant montre comment créer un 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());

Dans les exemples ci-dessus, vous avez fixé le nombre d'entités à renvoyer par recherche(batch_size/batchSize) à 50, et le nombre total d'entités à renvoyer(topK) à 20 000.

Utiliser le SearchIterator

Une fois que le SearchIterator est prêt, vous pouvez appeler sa méthode next() pour obtenir les résultats de la recherche de manière paginée.

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

Dans les exemples de code ci-dessus, vous avez créé une boucle infinie et appelé la méthode next() dans la boucle pour stocker les résultats de la recherche dans une variable et fermer l'itérateur lorsque next() ne renvoie rien.

Traduit parDeepL

Try Managed Milvus for Free

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

Get Started
Feedback

Cette page a-t - elle été utile ?