milvus-logo
LFAI
Home
  • Guía del usuario

Iterador de búsqueda

La Búsqueda RNA tiene un límite máximo en el número de entidades que se pueden recuperar en una sola consulta, y el simple uso de la Búsqueda RNA básica puede no satisfacer las demandas de recuperación a gran escala. Para las peticiones de Búsqueda RNA en las que topK supere los 16.384, es aconsejable considerar el uso de SearchIterator. En esta sección se explica cómo utilizar el SearchIterator y las consideraciones relacionadas.

Visión general

Una petición Search devuelve resultados de búsqueda, mientras que un SearchIterator devuelve un iterador. Puede llamar al método next() de este iterador para obtener los resultados de la búsqueda.

En concreto, puede utilizar los SearchIterators de la siguiente manera.

  1. Crear un SearchIterator y establecer el número de entidades a devolver por petición de búsqueda y el número total de entidades a devolver.

  2. Llame al método next() del SearchIterator en un bucle para obtener el resultado de la búsqueda de forma paginada.

  3. Llame al método close() del iterador para finalizar el bucle si el método next() devuelve un resultado vacío.

Crear un SearchIterator

El siguiente fragmento de código muestra cómo crear 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());

En los ejemplos anteriores, has establecido el número de entidades a devolver por búsqueda(batch_size/batchSize) en 50, y el número total de entidades a devolver(topK) en 20.000.

Utilizar SearchIterator

Una vez que el SearchIterator está listo, puedes llamar a su método next() para obtener los resultados de la búsqueda de forma paginada.

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

En los ejemplos de código anteriores, has creado un bucle infinito y has llamado al método next() en el bucle para almacenar los resultados de la búsqueda en una variable y has cerrado el iterador cuando next() no devuelve nada.

Traducido porDeepL

Try Managed Milvus for Free

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

Get Started
Feedback

¿Fue útil esta página?