مكرر البحث
يحتوي بحث ANN Search على حد أقصى لعدد الكيانات التي يمكن استدعاؤها في استعلام واحد، وقد لا يلبي مجرد استخدام بحث ANN Search الأساسي متطلبات الاسترجاع على نطاق واسع. بالنسبة لطلبات بحث ANN Search حيث يتجاوز عدد الكيانات الأعلىK 16,384 كيانًا، يُنصح باستخدام أداة التكرار SearchIterator. سيقدم هذا القسم كيفية استخدام SearchIterator والاعتبارات ذات الصلة.
نظرة عامة
يقوم طلب البحث بإرجاع نتائج البحث، بينما يقوم SearchIterator بإرجاع مكرر. يمكنك استدعاء الأسلوب التالي() لهذا المُؤشِّر للحصول على نتائج البحث.
على وجه التحديد، يمكنك استخدام SearchIterators على النحو التالي.
قم بإنشاء SearchIterator وقم بتعيين عدد الكيانات المراد إرجاعها لكل طلب بحث والعدد الإجمالي للكيانات المراد إرجاعها.
استدعاء الأسلوب التالي() من 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());
في الأمثلة أعلاه، لقد قمت بتعيين عدد الكيانات المراد إرجاعها لكل بحث(batch_size/batchSize) إلى 50، والعدد الإجمالي للكيانات المراد إرجاعها(topK) إلى 20,000.
استخدام SearchIterator
بمجرد أن يصبح SearchIterator جاهزًا، يمكنك استدعاء طريقة التالي() الخاصة به للحصول على نتائج البحث بطريقة ترقيم الصفحات.
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);
}
}
في الأمثلة البرمجية أعلاه، قمتَ بإنشاء حلقة لا نهائية واستدعيتَ طريقة التالي() في الحلقة لتخزين نتائج البحث في متغير وأغلقتَ المُؤشِّر عندما لا يُرجع التالي() شيئًا.