🚀 جرب Zilliz Cloud، الـ Milvus المدارة بالكامل، مجاناً — تجربة أداء أسرع بـ 10 أضعاف! جرب الآن>>

milvus-logo
LFAI
الصفحة الرئيسية
  • دليل المستخدم
  • Home
  • Docs
  • دليل المستخدم

  • البحث وإعادة التصنيف

  • مكرر البحث

مكرر البحث

يحتوي بحث ANN Search على حد أقصى لعدد الكيانات التي يمكن استدعاؤها في استعلام واحد، وقد لا يلبي مجرد استخدام بحث ANN Search الأساسي متطلبات الاسترجاع على نطاق واسع. بالنسبة لطلبات بحث ANN Search حيث يتجاوز عدد الكيانات الأعلىK 16,384 كيانًا، يُنصح باستخدام أداة التكرار SearchIterator. سيقدم هذا القسم كيفية استخدام SearchIterator والاعتبارات ذات الصلة.

نظرة عامة

يقوم طلب البحث بإرجاع نتائج البحث، بينما يقوم SearchIterator بإرجاع مكرر. يمكنك استدعاء الأسلوب التالي() لهذا المُؤشِّر للحصول على نتائج البحث.

على وجه التحديد، يمكنك استخدام SearchIterators على النحو التالي.

  1. قم بإنشاء SearchIterator وقم بتعيين عدد الكيانات المراد إرجاعها لكل طلب بحث والعدد الإجمالي للكيانات المراد إرجاعها.

  2. استدعاء الأسلوب التالي() من SearchIterator في حلقة للحصول على نتيجة البحث بطريقة ترقيم الصفحات.

  3. استدع أسلوب الإغلاق() الخاص بالمُكرر لإنهاء الحلقة إذا أرجع الأسلوب التالي() نتيجة فارغة.

إنشاء مكرر بحث

يوضِّح مقتطف الشيفرة التالي كيفية إنشاء مُؤشِّر بحث.

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

في الأمثلة البرمجية أعلاه، قمتَ بإنشاء حلقة لا نهائية واستدعيتَ طريقة التالي() في الحلقة لتخزين نتائج البحث في متغير وأغلقتَ المُؤشِّر عندما لا يُرجع التالي() شيئًا.

جرب Managed Milvus مجاناً

Zilliz Cloud خالي من المتاعب، ويعمل بواسطة Milvus ويعمل بسرعة 10 أضعاف.

ابدأ
التعليقات

هل كانت هذه الصفحة مفيدة؟