البحث في النطاق باستخدام StructArray
استخدم هذه الصفحة لإجراء بحث النطاق على الحقول الفرعية للمتجه StructArray. يُرجع بحث النطاق نتائج المتجهات التي تقع درجاتها أو مسافاتها ضمن حدود محددة. بالنسبة لحقول StructArray، استخدم بحث النطاق مع بحث المتجهات على مستوى العناصر، حيث يتم البحث في كل عنصر من عناصر Struct بشكل مستقل.
تستخدم هذه الصفحة المجموعة « tech_articles » من «إنشاء حقل StructArray». تحتوي المجموعة على حقل StructArray باسم « chunks ». يتم فهرسة الحقل الفرعي المتجه « chunks[emb] » للبحث على مستوى العناصر باستخدام مقياس متجه عادي مثل « COSINE » أو « IP » أو « L2 ».
كيفية تطبيق البحث عن النطاق على StructArray
| وضع البحث | سلوك البحث عن النطاق | دقة النتائج |
|---|---|---|
| البحث في EmbeddingList | غير مدعوم. | غير قابل للتطبيق. |
| البحث على مستوى العناصر | استخدم استعلام متجه عادي باستخدام radius ، واختياريًا، range_filter. | مستوى عنصر البنية. |
| البحث المختلط | يتم دعمه عندما يستهدف طلب StructArray حقل متجه على مستوى العنصر. لا تدعم الطلبات على مستوى EmbeddingList البحث عن النطاق. | البحث الفرعي على مستوى العناصر، ثم إعادة الترتيب الهجين. |
إذا كنت بحاجة إلى عناصر Struct الأقرب فقط، فابدأ بالبحث المتجه الأساسي باستخدام StructArray. استخدم البحث عن النطاق عندما يجب أن تستوفي النتيجة حدًا معينًا للدرجة أو المسافة بدلاً من مجرد ترتيب أعلى K.
قبل البدء
قم بإعداد المجموعة والبيانات والفهارس قبل تشغيل البحث في النطاق.
| المتطلبات | التفاصيل |
|---|---|
| حقل StructArray | تحتوي المجموعة على حقل StructArray مثل chunks. |
| الحقل الفرعي للمتجه على مستوى العنصر | الحقل الفرعي للمتجه المستهدف هو chunks[emb] ، وليس chunks[emb_list_vector]. |
| مقياس الفهرسة | يتم فهرسة الحقل الفرعي للمتجه باستخدام مقياس متجه عادي، مثل COSINE أو IP أو L2. |
| بيانات الاستعلام | الاستعلام هو متجه عادي، وليس EmbeddingList. |
لإعداد الفهرس، راجع حقول StructArray في الفهرس.
استخدم radius و range_filter
اضبط radius لتحديد حدود البحث. اضبط range_filter عندما تحتاج إلى حدود داخلية أيضًا. يعتمد الاتجاه على ما إذا كانت المسافة الأصغر هي الأفضل أم أن درجة التشابه الأكبر هي الأفضل.
| نوع المقياس | هل الدرجة الأعلى هي الأفضل؟ | شرط النطاق عند استخدام range_filter |
|---|---|---|
L2 | لا. المسافة الأقصر هي الأفضل. | range_filter <= distance < radius |
IP، COSINE | نعم. كلما زادت النتيجة، كان ذلك أفضل. | radius < distance <= range_filter |
عند تعيين " radius " فقط، يُرجع البحث عن النطاق النتائج التي تستوفي الحد الخارجي للمقياس. اختر القيم وفقًا لمقياس الدرجة أو المسافة الخاص بعمليات التضمين الخاصة بك.
تشغيل البحث في النطاق على مستوى العناصر
يبحث المثال التالي عن المجموعات الفردية التي تكون متجهات chunks[emb] الخاصة بها مشابهة بدرجة كافية لمتجه الاستعلام. تمثل كل نتيجة مطابقة عنصر Struct مطابقًا.
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus",
)
query_vector = [0.19, 0.24, 0.30, 0.37]
results = client.search(
collection_name="tech_articles",
data=[query_vector],
anns_field="chunks[emb]",
search_params={
"params": {
"radius": 0.80,
"range_filter": 0.95,
},
},
limit=10,
output_fields=[
"doc_id",
"title",
"chunks[text]",
"chunks[section]",
"chunks[page]",
"chunks[quality_score]",
],
)
for hits in results:
for hit in hits:
print(
"doc_id:", hit["id"],
"distance:", hit["distance"],
"offset:", hit.get("offset"),
"entity:", hit["entity"],
)
في هذا المثال، يُعد « COSINE » مقياسًا من نوع التشابه، لذا فإن نطاق النتائج أكبر من radius وأصغر من أو يساوي range_filter. تحدد قيمة « offset » عنصر Struct المطابق في المصفوفة chunks عند إرجاعها.
إضافة عوامل تصفية قياسية
يمكنك الجمع بين البحث عن النطاق على مستوى العناصر والتصفية القياسية لـ StructArray. استخدم مسندًا من المستوى الأعلى لحقول الكيان الأصلي، واستخدم element_filter لتقييد عناصر Struct التي تشارك في البحث عن نطاق المتجه.
filter_expr = (
'category == "search" && '
'element_filter(chunks, '
'$[section] == "index" && '
'$[quality_score] > 0.9)'
)
results = client.search(
collection_name="tech_articles",
data=[query_vector],
anns_field="chunks[emb]",
search_params={
"params": {
"radius": 0.80,
"range_filter": 0.95,
},
},
filter=filter_expr,
limit=10,
output_fields=[
"doc_id",
"title",
"category",
"chunks[text]",
"chunks[section]",
"chunks[quality_score]",
],
)
تقوم المسلمة ذات المستوى الأعلى باختيار الكيانات المرشحة. أما مسلمة element_filter فتقصر البحث عن النطاق المتجه على عناصر Struct المطابقة. لمزيد من أمثلة التصفية، راجع البحث المُصفى باستخدام StructArray.
استخدام البحث عن النطاق في البحث المختلط
تدعم حقول المتجهات على مستوى العناصر في StructArray البحث عن النطاق في البحث المختلط. أضف radius و، اختياريًا، range_filter إلى AnnSearchRequest الذي يستهدف حقل المتجهات على مستوى العناصر في StructArray.
from pymilvus import AnnSearchRequest, RRFRanker
title_req = AnnSearchRequest(
data=[query_vector],
anns_field="title_vector",
limit=10,
)
chunk_req = AnnSearchRequest(
data=[query_vector],
anns_field="chunks[emb]",
param={
"params": {
"radius": 0.80,
"range_filter": 0.95,
},
},
limit=10,
expr='element_filter(chunks, $[section] == "index")',
)
results = client.hybrid_search(
collection_name="tech_articles",
reqs=[title_req, chunk_req],
ranker=RRFRanker(),
limit=5,
output_fields=[
"doc_id",
"title",
"chunks[text]",
"chunks[section]",
"chunks[quality_score]",
],
)
في هذا المثال، يستخدم الطلب الفرعي chunks[emb] فقط معلمات البحث عن النطاق. ولا يزال طلب StructArray يتبع دلالات مستوى العنصر: حيث تنطبق حدود النطاق على نتائج عنصر Struct قبل أن يقوم البحث الهجين بدمج النتائج وإعادة ترتيبها.
تفسير نتائج النطاق
| عنصر النتيجة | المعنى |
|---|---|
id | المفتاح الأساسي للكيان الذي يحتوي على عنصر Struct المطابق. |
distance أو النتيجة | النتيجة أو المسافة بين متجه الاستعلام ومتجه عنصر Struct المطابق. |
offset | الموضع الذي يبدأ من الصفر لعنصر Struct المطابق في حقل StructArray عند إرجاعه. |
| المفاتيح الأساسية المتكررة | ممكن. يمكن أن يقع أكثر من عنصر Struct واحد في نفس الكيان ضمن النطاق المحدد. |
limit | ينطبق على نتائج العناصر، وليس على الكيانات الأصلية الفريدة. |
القيود
لا تستخدم استعلام "
EmbeddingList" أو مقياس "MAX_SIM*" للبحث عن النطاق في الحقول الفرعية للمتجه StructArray. لا يدعم البحث على مستوى EmbeddingList البحث عن النطاق.لا تجمع بين البحث النطاقي والبحث التجميعي. إذا كنت بحاجة إلى نتيجة واحدة لكل كيان أبوي، فقم بتشغيل بحث على مستوى العناصر بدون معلمات النطاق واستخدم التجميع حيثما كان ذلك مدعومًا.
يتم دعم البحث النطاقي المختلط لحقول المتجهات على مستوى العناصر في StructArray. ولا يتم دعمه لطلبات StructArray على مستوى EmbeddingList.
الأخطاء الشائعة
تشغيل البحث النطاقي على
chunks[emb_list_vector]، وهو مخصص للبحث على مستوى EmbeddingList.استخدام
MAX_SIM_COSINEبدلاً من مقياس عادي مثلCOSINEللبحث في النطاق على مستوى العنصر.استخدام استعلام
EmbeddingListبدلاً من استعلام متجه عادي.توقع أن تكون نتائج البحث عن النطاق فريدة لكل كيان أبوي. يعرض البحث عن النطاق نتائج مطابقة لعناصر Struct.
استخدام
chunks.embبدلاً من صيغة مسار الحقل الفرعي المطلوبةchunks[emb].
الخطوات التالية
لمعرفة وضعي البحث المتجهي الأساسيين لـ StructArray، اقرأ «البحث المتجهي الأساسي باستخدام StructArray».
لإضافة عوامل تصفية قياسية إلى البحث في النطاق، اقرأ «البحث المُصفى باستخدام StructArray».
لإرجاع نتيجة واحدة على الأكثر لكل كيان أساسي حيثما كان ذلك مدعومًا، اقرأ " البحث المجمّع باستخدام StructArray".
للتحقق من حدود البحث الخاصة بالإصدار، اقرأ " حدود StructArray".