البحث في النطاق باستخدام 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].

الخطوات التالية

  1. لمعرفة وضعي البحث المتجهي الأساسيين لـ StructArray، اقرأ «البحث المتجهي الأساسي باستخدام StructArray».

  2. لإضافة عوامل تصفية قياسية إلى البحث في النطاق، اقرأ «البحث المُصفى باستخدام StructArray».

  3. لإرجاع نتيجة واحدة على الأكثر لكل كيان أساسي حيثما كان ذلك مدعومًا، اقرأ " البحث المجمّع باستخدام StructArray".

  4. للتحقق من حدود البحث الخاصة بالإصدار، اقرأ " حدود StructArray".