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

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

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

  • البحث عن النطاق

بحث النطاق

يعمل البحث في النطاق على تحسين ملاءمة نتائج البحث من خلال تقييد المسافة أو درجة الكيانات التي تم إرجاعها ضمن نطاق محدد. تساعدك هذه الصفحة على فهم ماهية بحث النطاق وإجراءات إجراء بحث النطاق.

نظرة عامة

عند تنفيذ طلب البحث عن النطاق، يستخدم ميلفوس المتجهات الأكثر تشابهًا مع متجه الاستعلام من نتائج بحث النطاق كمركز، مع تحديد نصف القطر المحدد في طلب البحث كنصف قطر الدائرة الخارجية، وفلتر_النطاق_نصف قطر الدائرة الداخلية لرسم دائرتين متحدتي المركز. سيتم إرجاع جميع المتجهات ذات درجات التشابه التي تقع داخل المنطقة الحلقية التي تشكلها هاتان الدائرتان متحدة المركز. هنا، يمكن ضبط range_filter على مما يشير إلى أنه سيتم إرجاع جميع الكيانات التي تقع ضمن درجة التشابه المحددة (نصف القطر).

Range search بحث النطاق

يوضح الرسم البياني أعلاه أن طلب البحث عن النطاق يحمل معلمتين: نصف القطر و range_filter. عند تلقي طلب بحث النطاق، يقوم ميلفوس بما يلي.

  • استخدام نوع المقياس المحدد(COSINE) للعثور على جميع تضمينات المتجهات الأكثر تشابهًا مع متجه الاستعلام.

  • تصفية التضمينات المتجهة التي تقع مسافاتها أو درجاتها إلى متجه الاستعلام ضمن النطاق المحدد بواسطة معلمات نصف القطر و range_filter.

  • إرجاع الكيانات الأعلى K من الكيانات التي تمت تصفيتها.

تختلف طريقة تعيين نصف القطر و range_filter_filter باختلاف نوع مقياس البحث. يسرد الجدول التالي متطلبات تعيين هاتين المعلمتين مع أنواع المقاييس المختلفة.

نوع المتري

الدلالات

متطلبات تعيين نصف القطر و range_filter_filter

L2

تشير المسافة L2 الأصغر إلى تشابه أعلى.

لتجاهل التضمينات المتجهة الأكثر تشابهًا، تأكد من أن

range_filter <= المسافة < radius

IP

تشير مسافة IP الأكبر إلى تشابه أعلى.

لتجاهل التضمينات المتجهة الأكثر تشابهًا، تأكد من أن

radius << المسافة <= range_filter

COSINE

تشير مسافة COSINE الأكبر إلى تشابه أعلى.

لتجاهل أكثر تضمينات المتجهات تشابهًا، تأكد من أن

radius <المسافة <= range_filter

JACCARD

تشير مسافة جاكارد الأصغر إلى تشابه أعلى.

لتجاهل تضمينات المتجهات الأكثر تشابهًا، تأكد من أن

range_filter <= المسافة < radius

HAMMING

تشير مسافة هامينج الأصغر إلى تشابه أعلى.

لتجاهل تضمينات المتجهات الأكثر تشابهًا، تأكد من أن

range_filter <= المسافة < radius

أمثلة

يوضح هذا القسم كيفية إجراء بحث في النطاق. لا تحمل طلبات البحث في مقتطفات التعليمات البرمجية التالية نوع متري، مما يشير إلى تطبيق نوع المتري الافتراضي COSINE. في هذه الحالة، تأكد من أن قيمة نصف القطر أصغر من قيمة range_filter.

في مقتطفات التعليمات البرمجية التالية، قم بتعيين radius إلى 0.4 و range_filter إلى 0.6 بحيث يُرجع Milvus جميع الكيانات التي تقع مسافاتها أو درجاتها إلى متجه الاستعلام في حدود 0.4 إلى 0.6.

from pymilvus import MilvusClient

client = MilvusClient(
    uri="http://localhost:19530",
    token="root:Milvus"
)

query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]

res = client.search(
    collection_name="my_collection",
    data=[query_vector],
    limit=3,
    search_params={
        # highlight-start
        "params": {
            "radius": 0.4,
            "range_filter": 0.6
        }
        # highlight-end
    }
)

for hits in res:
    print("TopK results:")
    for hit in hits:
        print(hit)

import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
 io.milvus.v2.service.vector.request.SearchReq
import io.milvus.v2.service.vector.request.data.FloatVec;
import io.milvus.v2.service.vector.response.SearchResp


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});
Map<String,Object> extraParams = new HashMap<>();
extraParams.put("radius", 0.4);
extraParams.put("range_filter", 0.6);
SearchReq searchReq = SearchReq.builder()
        .collectionName("range_search_collection")
        .data(Collections.singletonList(queryVector))
        .topK(5)
        .searchParams(extraParams)
        .build();

SearchResp searchResp = client.search(searchReq);

List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();
for (List<SearchResp.SearchResult> results : searchResults) {
    System.out.println("TopK results:");
    for (SearchResp.SearchResult result : results) {
        System.out.println(result);
    }
}

// Output
// TopK results:
// SearchResp.SearchResult(entity={}, score=0.5975797, id=4)
// SearchResp.SearchResult(entity={}, score=0.46704385, id=5)

// TODO 

import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";

const address = "http://localhost:19530";
const token = "root:Milvus";
const client = new MilvusClient({address, token});

var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]

res = await client.search({
    collection_name: "range_search_collection",
    data: [query_vector],
    limit: 5,
    // highlight-start
    params: {
        "radius": 0.4,
        "range_filter": 0.6
    }
    // highlight-end
})

export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"

curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
    "collectionName": "quick_setup",
    "data": [
        [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]
    ],
    "annsField": "vector",
    "filter": "color like \"red%\" and likes > 50",
    "limit": 3,
    "searchParams": {
        "params": {
            "radius": 0.4,
            "range_filter": 0.6
        }
    }
}'
# {"code":0,"cost":0,"data":[]}

جرب Managed Milvus مجاناً

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

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

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