بحث النطاق
يعمل البحث في النطاق على تحسين ملاءمة نتائج البحث من خلال تقييد المسافة أو درجة الكيانات التي تم إرجاعها ضمن نطاق محدد. تساعدك هذه الصفحة على فهم ماهية بحث النطاق وإجراءات إجراء بحث النطاق.
نظرة عامة
عند تنفيذ طلب البحث عن النطاق، يستخدم ميلفوس المتجهات الأكثر تشابهًا مع متجه الاستعلام من نتائج بحث النطاق كمركز، مع تحديد نصف القطر المحدد في طلب البحث كنصف قطر الدائرة الخارجية، وفلتر_النطاق_نصف قطر الدائرة الداخلية لرسم دائرتين متحدتي المركز. سيتم إرجاع جميع المتجهات ذات درجات التشابه التي تقع داخل المنطقة الحلقية التي تشكلها هاتان الدائرتان متحدة المركز. هنا، يمكن ضبط range_filter على 0، مما يشير إلى أنه سيتم إرجاع جميع الكيانات التي تقع ضمن درجة التشابه المحددة (نصف القطر).
بحث النطاق
يوضح الرسم البياني أعلاه أن طلب البحث عن النطاق يحمل معلمتين: نصف القطر و range_filter. عند تلقي طلب بحث النطاق، يقوم ميلفوس بما يلي.
استخدام نوع المقياس المحدد(COSINE) للعثور على جميع تضمينات المتجهات الأكثر تشابهًا مع متجه الاستعلام.
تصفية التضمينات المتجهة التي تقع مسافاتها أو درجاتها إلى متجه الاستعلام ضمن النطاق المحدد بواسطة معلمات نصف القطر و range_filter.
إرجاع الكيانات الأعلى K من الكيانات التي تمت تصفيتها.
تختلف طريقة تعيين نصف القطر و range_filter_filter باختلاف نوع مقياس البحث. يسرد الجدول التالي متطلبات تعيين هاتين المعلمتين مع أنواع المقاييس المختلفة.
نوع المتري | الدلالات | متطلبات تعيين نصف القطر و range_filter_filter |
---|---|---|
| تشير المسافة L2 الأصغر إلى تشابه أعلى. | لتجاهل التضمينات المتجهة الأكثر تشابهًا، تأكد من أن
|
| تشير مسافة IP الأكبر إلى تشابه أعلى. | لتجاهل التضمينات المتجهة الأكثر تشابهًا، تأكد من أن
|
| تشير مسافة COSINE الأكبر إلى تشابه أعلى. | لتجاهل أكثر تضمينات المتجهات تشابهًا، تأكد من أن
|
| تشير مسافة جاكارد الأصغر إلى تشابه أعلى. | لتجاهل تضمينات المتجهات الأكثر تشابهًا، تأكد من أن
|
| تشير مسافة هامينج الأصغر إلى تشابه أعلى. | لتجاهل تضمينات المتجهات الأكثر تشابهًا، تأكد من أن
|
أمثلة
يوضح هذا القسم كيفية إجراء بحث في النطاق. لا تحمل طلبات البحث في مقتطفات التعليمات البرمجية التالية نوع متري، مما يشير إلى تطبيق نوع المتري الافتراضي 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":[]}