كيفية العمل مع نتائج البحث في Azure الذكاء الاصطناعي Search

توضح هذه المقالة كيفية العمل مع استجابة استعلام في Azure الذكاء الاصطناعي Search. يتم تحديد بنية الاستجابة بواسطة المعلمات في الاستعلام نفسه، كما هو موضح في Search Documents (REST) أو SearchResults Class (Azure for .NET).

تحدد المعلمات في الاستعلام ما يلي:

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

تكوين النتيجة

تكون النتائج جدولية، تتكون من حقول من كافة الحقول "القابلة للاسترداد"، أو تقتصر فقط على تلك الحقول المحددة في $select المعلمات. الصفوف هي المستندات المطابقة.

يمكنك اختيار الحقول الموجودة في نتائج البحث. في حين أن مستند البحث قد يحتوي على عدد كبير من الحقول، عادة ما تكون هناك حاجة إلى عدد قليل فقط لتمثيل كل مستند في النتائج. في طلب استعلام، قم بالإلحاق $select=<field list> لتحديد الحقول "القابلة للاسترداد" التي يجب أن تظهر في الاستجابة.

اختر الحقول التي توفر التباين والتمايز بين المستندات، ما يوفر معلومات كافية لدعوة استجابة النقر من قبل المستخدم. على موقع التجارة الإلكترونية، قد يكون اسم المنتج والوصف والعلامة التجارية واللون والحجم والسعر والتصنيف. بالنسبة إلى فهرس نموذج الفنادق المضمن، قد يكون حقول "تحديد" في المثال التالي:

POST /indexes/hotels-sample-index/docs/search?api-version=2020-06-30 
    {  
      "search": "sandy beaches",
      "select": "HotelId, HotelName, Description, Rating, Address/City"
      "count": true
    }

إشعار

بالنسبة للصور في النتائج، مثل صورة منتج أو شعار، قم بتخزينها خارج Azure الذكاء الاصطناعي Search، ولكن أضف حقلا في الفهرس للإشارة إلى عنوان URL للصورة في مستند البحث. تتضمن نماذج الفهارس التي توضح الصور في النتائج العرض التوضيحي realestate-sample-us (مجموعة بيانات نموذجية مضمنة يمكنك إنشاؤها بسهولة في معالج استيراد البيانات)، والتطبيق التجريبي لوظائف مدينة نيويورك.

تلميحات للحصول على نتائج غير متوقعة

في بعض الأحيان، تكون المادة وليس بنية النتائج غير متوقعة. على سبيل المثال، قد تجد أن بعض النتائج تبدو مكررة، أو أن النتيجة التي يجب أن تظهر بالقرب من الأعلى يتم وضعها في أسفل النتائج. عندما تكون نتائج الاستعلام غير متوقعة، يمكنك تجربة تعديلات الاستعلام هذه لمعرفة ما إذا كانت النتائج تتحسن:

  • قم بتغيير searchMode=any (افتراضي) إلى searchMode=all لطلب تطابقات على جميع المعايير بدلا من أي من المعايير. هذا صحيح بشكل خاص عند تضمين عوامل التشغيل المنطقية الاستعلام.

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

عد التطابقات

ترجع معلمة count عدد المستندات في الفهرس التي تعتبر مطابقة للاستعلام. لإرجاع العدد، أضف $count=true إلى طلب الاستعلام. لا توجد قيمة قصوى تفرضها خدمة البحث. استنادا إلى الاستعلام ومحتوى المستندات، قد يكون العدد مرتفعا مثل كل مستند في الفهرس.

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

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

تلميح

للتحقق من عمليات الفهرسة، يمكنك تأكيد ما إذا كان الفهرس يحتوي على العدد المتوقع من المستندات عن طريق إضافة $count=true استعلام بحث search=* فارغ. والنتيجة هي العدد الكامل للمستندات في الفهرس.

عند اختبار بناء جملة الاستعلام، $count=true يمكن أن يخبرك بسرعة ما إذا كانت تعديلاتك ترجع نتائج أكبر أو أقل، والتي يمكن أن تكون ملاحظات مفيدة.

نتائج الترحيل

بشكل افتراضي، يرجع محرك البحث ما يصل إلى أول 50 تطابقا. يتم تحديد أعلى 50 حسب درجة البحث، بافتراض أن الاستعلام هو بحث كامل عن النص أو دلالي. وإلا، فإن أعلى 50 ترتيبا عشوائيا للاستعلامات المتطابقة الدقيقة (حيث يشير "@searchScore= 1.0" الموحد إلى ترتيب عشوائي).

للتحكم في ترحيل كافة المستندات التي تم إرجاعها في مجموعة نتائج، أضف $top معلمات و $skip إلى طلب استعلام GET، أو topskip إلى طلب استعلام POST. توضح القائمة التالية المنطق.

  • إرجاع المجموعة الأولى من 15 مستندا مطابقا بالإضافة إلى عدد إجمالي التطابقات: GET /indexes/<INDEX-NAME>/docs?search=<QUERY STRING>&$top=15&$skip=0&$count=true

  • إرجاع المجموعة الثانية، تخطي أول 15 للحصول على 15 التالية: $top=15&$skip=15. كرر لمجموعة ال 15 الثالثة: $top=15&$skip=30

لا تضمن نتائج الاستعلامات المرقمة أن تكون مستقرة إذا كان الفهرس الأساسي يتغير. يغير الترحيل قيمة $skip لكل صفحة، ولكن كل استعلام مستقل ويعمل على طريقة العرض الحالية للبيانات كما هو موجود في الفهرس في وقت الاستعلام (بمعنى آخر، لا يوجد تخزين مؤقت أو لقطة للنتائج، مثل تلك الموجودة في قاعدة بيانات للأغراض العامة).

فيما يلي مثال على كيفية الحصول على التكرارات. افترض فهرسا بأربعة مستندات:

{ "id": "1", "rating": 5 }
{ "id": "2", "rating": 3 }
{ "id": "3", "rating": 2 }
{ "id": "4", "rating": 1 }

الآن افترض أنك تريد إرجاع النتائج اثنين في كل مرة، مرتبة حسب التصنيف. يمكنك تنفيذ هذا الاستعلام للحصول على الصفحة الأولى من النتائج: $top=2&$skip=0&$orderby=rating desc، وإنتاج النتائج التالية:

{ "id": "1", "rating": 5 }
{ "id": "2", "rating": 3 }

في الخدمة، افترض إضافة مستند خامس إلى الفهرس بين استدعاءات الاستعلام: { "id": "5", "rating": 4 }. بعد ذلك بوقت قصير، يمكنك تنفيذ استعلام لإحضار الصفحة الثانية: $top=2&$skip=2&$orderby=rating desc، والحصول على هذه النتائج:

{ "id": "2", "rating": 3 }
{ "id": "3", "rating": 2 }

لاحظ أنه يتم إحضار المستند 2 مرتين. وذلك لأن المستند الجديد 5 له قيمة أكبر للتصنيف، لذلك فإنه يفرز قبل المستند 2 ويهبط على الصفحة الأولى. على الرغم من أن هذا السلوك قد يكون غير متوقع، فإنه نموذجي لكيفية تصرف محرك البحث.

ترحيل الصفحات من خلال عدد كبير من النتائج

استخدام $top استعلام $skip بحث ويسمح له بالصفحة عبر 100,000 نتيجة، ولكن ماذا لو كانت النتائج أكبر من 100,000؟ للصفحة عبر استجابة بهذا الحجم، استخدم ترتيب الفرز وعامل تصفية النطاق كحل بديل ل $skip.

في هذا الحل البديل، يتم تطبيق الفرز والتصفية على حقل معرف مستند أو حقل آخر فريد لكل مستند. يجب أن يكون للحقل filterable الفريد وإسناده sortable في فهرس البحث.

  1. إصدار استعلام لإرجاع صفحة كاملة من النتائج التي تم فرزها.

    POST /indexes/good-books/docs/search?api-version=2020-06-30
        {  
          "search": "divine secrets",
          "top": 50,
          "orderby": "id asc"
        }
    
  2. اختر النتيجة الأخيرة التي تم إرجاعها بواسطة استعلام البحث. يتم عرض نتيجة مثال بقيمة "معرف" فقط هنا.

    {
        "id": "50"
    }
    
  3. استخدم قيمة "المعرف" هذه في استعلام نطاق لإحضار الصفحة التالية من النتائج. يجب أن يحتوي حقل "المعرف" هذا على قيم فريدة، وإلا فقد يتضمن ترقيم الصفحات نتائج مكررة.

    POST /indexes/good-books/docs/search?api-version=2020-06-30
        {  
          "search": "divine secrets",
          "top": 50,
          "orderby": "id asc",
          "filter": "id ge 50"
        }
    
  4. ينتهي ترقيم الصفحات عندما يقوم الاستعلام بإرجاع نتائج صفرية.

إشعار

لا يمكن تمكين السمتين "القابلة للتصفية" و"القابلة للفرز" إلا عند إضافة حقل إلى فهرس لأول مرة، ولا يمكن تمكينهما في حقل موجود.

ترتيب النتائج

في استعلام البحث عن نص كامل، يمكن تصنيف النتائج حسب:

  • درجة بحث
  • درجة إعادة التدرن الدلالي
  • ترتيب فرز في حقل "قابل للفرز"

يمكنك أيضا تعزيز أي تطابقات موجودة في حقول معينة عن طريق إضافة ملف تعريف تسجيل.

ترتيب حسب درجة البحث

بالنسبة لاستعلامات البحث عن النص الكامل، يتم تصنيف النتائج تلقائيا حسب درجة البحث، ويتم حسابها استنادا إلى تكرار المصطلح والتقارب في مستند (مشتق من TF-IDF)، مع درجات أعلى تذهب إلى المستندات التي لها تطابقات أكثر أو أقوى على مصطلح بحث.

نطاق "@search.score" إما غير مقيد أو يصل إلى (ولكن لا يتضمن) 1.00 على الخدمات القديمة.

بالنسبة لأي من الخوارزميات، تشير "@search.score" التي تساوي 1.00 إلى مجموعة نتائج غير مسجلة أو غير مصنفة، حيث تكون درجة 1.0 موحدة عبر جميع النتائج. تحدث النتائج غير المسجلة عندما يكون نموذج الاستعلام عبارة عن بحث غامض أو استعلامات البدل أو regex أو بحث فارغ (search=*). إذا كنت بحاجة إلى فرض بنية ترتيب على النتائج غير المسجلة، ففكر في تعبير $orderby لتحقيق هذا الهدف.

ترتيب بواسطة إعادة ترتيب الدلالي

إذا كنت تستخدم الترتيب الدلالي، فإن "@search.rerankerScore" يحدد ترتيب فرز النتائج.

يتراوح نطاق "@search.rerankerScore" من 1 إلى 4.00، حيث تشير الدرجة الأعلى إلى تطابق دلالي أقوى.

الطلب مع $orderby

إذا كان الترتيب المتناسق أحد متطلبات التطبيق، يمكنك تعريف تعبير $orderby في حقل. يمكن استخدام الحقول التي تمت فهرستها على أنها "قابلة للفرز" فقط لترتيب النتائج.

الحقول شائعة $orderby الاستخدام في التصنيف والتاريخ والموقع. تتطلب التصفية حسب الموقع استدعاء تعبير عامل التصفية للدالةgeo.distance()، بالإضافة إلى اسم الحقل.

يتم فرز الحقول الرقمية (Edm.Double، Edm.Int32، Edm.Int64) بترتيب رقمي (على سبيل المثال، 1، 2، 10، 11، 20).

يتم فرز حقول السلسلة (Edm.String، حقول Edm.ComplexType الفرعية) إما بترتيب فرز ASCII أو ترتيب فرز Unicode، اعتمادا على اللغة. لا يمكنك فرز المجموعات من أي نوع.

  • يتم فرز المحتوى الرقمي في حقول السلسلة أبجديا (1، 10، 11، 2، 20).

  • يتم فرز سلاسل الأحرف الكبيرة قبل الأحرف الصغيرة (APPLE، Apple، الموز، الموز، التفاح، الموز). يمكنك تعيين تسوية نص للمعالجة المسبقة للنص قبل الفرز لتغيير هذا السلوك. لن يكون لاستخدام الرمز المميز بالأحرف الصغيرة في حقل أي تأثير على سلوك الفرز لأن Azure الذكاء الاصطناعي البحث يفرز على نسخة غير محلل من الحقل.

  • تظهر السلاسل التي تؤدي مع علامات التشكيل الأخيرة (Äpfel، Öffnen، Üben)

تعزيز الصلة باستخدام ملف تعريف تسجيل النقاط

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

تمييز الضغط

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

لاحظ أنه يتم تطبيق التمييز على المصطلحات الفردية. لا توجد إمكانية تمييز لمحتويات حقل بأكمله. إذا كنت تريد التمييز فوق عبارة، فسيتعين عليك توفير المصطلحات المطابقة (أو العبارة) في سلسلة استعلام محاطة باقتباس. يتم وصف هذه التقنية بمزيد من التفصيل في هذا القسم.

يتم توفير إرشادات تمييز الضغط على طلب الاستعلام. الاستعلامات التي تؤدي إلى توسيع الاستعلام في المحرك، مثل البحث الغامض وأحرف البدل، لديها دعم محدود لتمييز الضغط.

متطلبات تمييز الزيارات

  • يجب أن تكون Edm.String الحقول أو Collection(Edm.String)
  • يجب أن تنسب الحقول إلى قابلة للبحث

تحديد التمييز في الطلب

لإرجاع المصطلحات المميزة، قم بتضمين المعلمة "تمييز" في طلب الاستعلام. يتم تعيين المعلمة إلى قائمة حقول محددة بفاصلة.

بشكل افتراضي، تكون علامة التنسيق هي <em>، ولكن يمكنك تجاوز العلامة باستخدام highlightPreTag المعلمات و highlightPostTag . تعالج التعليمات البرمجية للعميل الاستجابة (على سبيل المثال، تطبيق خط غامق أو خلفية صفراء).

POST /indexes/good-books/docs/search?api-version=2020-06-30 
    {  
      "search": "divine secrets",  
      "highlight": "title, original_title",
      "highlightPreTag": "<b>",
      "highlightPostTag": "</b>"
    }

بشكل افتراضي، يقوم Azure الذكاء الاصطناعي Search بإرجاع ما يصل إلى خمسة تمييزات لكل حقل. يمكنك ضبط هذا الرقم عن طريق إلحاق شرطة متبوعة بعدد صحيح. على سبيل المثال، "highlight": "description-10" إرجاع ما يصل إلى 10 مصطلحات مميزة على مطابقة المحتوى في حقل "الوصف".

النتائج المميزة

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

في البحث عن الكلمات الأساسية، يتم فحص كل مصطلح بشكل مستقل. سيعيد استعلام "الأسرار الإلهية" التطابقات على أي مستند يحتوي على أي من المصطلحين.

لقطة شاشة لتسليط الضوء على استعلام العبارة.

تمييز البحث عن الكلمات الأساسية

ضمن حقل مميز، يتم تطبيق التنسيق على مصطلحات كاملة. على سبيل المثال، في مقابل "الأسرار الإلهية لأخت Ya-Ya"، يتم تطبيق التنسيق على كل مصطلح بشكل منفصل، على الرغم من أنها متتالية.

"@odata.count": 39,
"value": [
    {
        "@search.score": 19.593246,
        "@search.highlights": {
            "original_title": [
                "<em>Divine</em> <em>Secrets</em> of the Ya-Ya Sisterhood"
            ],
            "title": [
                "<em>Divine</em> <em>Secrets</em> of the Ya-Ya Sisterhood"
            ]
        },
        "original_title": "Divine Secrets of the Ya-Ya Sisterhood",
        "title": "Divine Secrets of the Ya-Ya Sisterhood"
    },
    {
        "@search.score": 12.779835,
        "@search.highlights": {
            "original_title": [
                "<em>Divine</em> Madness"
            ],
            "title": [
                "<em>Divine</em> Madness (Cherub, #5)"
            ]
        },
        "original_title": "Divine Madness",
        "title": "Divine Madness (Cherub, #5)"
    },
    {
        "@search.score": 12.62534,
        "@search.highlights": {
            "original_title": [
                "Grave <em>Secrets</em>"
            ],
            "title": [
                "Grave <em>Secrets</em> (Temperance Brennan, #5)"
            ]
        },
        "original_title": "Grave Secrets",
        "title": "Grave Secrets (Temperance Brennan, #5)"
    }
]

تمييز البحث عن العبارة

ينطبق روبوت Who المصطلحات حتى على البحث في العبارة، حيث يتم تضمين مصطلحات متعددة بين علامتي اقتباس مزدوجتين. المثال التالي هو نفس الاستعلام، باستثناء أن "الأسرار الإلهية" يتم إرسالها كجملة محاطة باقتباس (يتطلب بعض عملاء REST أن تهرب من علامات الاقتباس الداخلية بخط مائل \"عكسي ):

POST /indexes/good-books/docs/search?api-version=2020-06-30 
    {  
      "search": "\"divine secrets\"",,
      "select": "title,original_title",
      "highlight": "title",
      "highlightPreTag": "<b>",
      "highlightPostTag": "</b>",
      "count": true
    }

نظرا لأن المعايير تحتوي الآن على كلا المصطلحات، يتم العثور على تطابق واحد فقط في فهرس البحث. تبدو الاستجابة للاستعلام أعلاه كما يلي:

{
    "@odata.count": 1,
    "value": [
        {
            "@search.score": 19.593246,
            "@search.highlights": {
                "title": [
                    "<b>Divine</b> <b>Secrets</b> of the Ya-Ya Sisterhood"
                ]
            },
            "original_title": "Divine Secrets of the Ya-Ya Sisterhood",
            "title": "Divine Secrets of the Ya-Ya Sisterhood"
        }
    ]
}

تمييز العبارة على الخدمات القديمة

خدمة البحث التي تم إنشاؤها قبل 15 يوليو 2020 تنفيذ تجربة تمييز مختلفة للاستعلامات العبارة.

للحصول على الأمثلة التالية، افترض سلسلة استعلام تتضمن العبارة المحاطة باقتباس "super bowl". قبل يوليو 2020، يتم تمييز أي مصطلح في العبارة:

"@search.highlights": {
    "sentence": [
        "The <em>super</em> <em>bowl</em> is <em>super</em> awesome with a <em>bowl</em> of chips"
   ]

بالنسبة لخدمات البحث التي تم إنشاؤها بعد يوليو 2020، سيتم إرجاع العبارات التي تطابق استعلام العبارة الكاملة فقط في "@search.highlights":

"@search.highlights": {
    "sentence": [
        "The <em>super</em> <em>bowl</em> is super awesome with a bowl of chips"
   ]

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

لإنشاء صفحة بحث للعميل بسرعة، ضع في اعتبارك هذه الخيارات:

  • ينشئ Application Generator، في المدخل، صفحة HTML مع شريط بحث والتنقل ذو الواجهات ومنطقة النتائج التي تتضمن الصور.

  • إضافة البحث إلى تطبيق ASP.NET Core (MVC) هو برنامج تعليمي ونموذج تعليمة برمجية يبني عميلا وظيفيا.

  • إضافة البحث إلى تطبيقات الويب هو نموذج تعليمي ورمز يستخدم مكتبات React JavaScript لتجربة المستخدم. يتم نشر التطبيق باستخدام Azure Static Web Apps.