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.
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.
Llame al método next() del SearchIterator en un bucle para obtener el resultado de la búsqueda de forma paginada.
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.