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.
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.
Rufen Sie die next() -Methode des SearchIterators in einer Schleife auf, um das Suchergebnis in einer paginierten Weise zu erhalten.
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.