استخدام بناء جملة البحث "البسيط" في البحث المعرفي في Azure

في Azure Cognitive Search، يستدعي بناء جملة الاستعلام البسيط محلل الاستعلام الافتراضي للبحث عن النص الكامل. المحلل اللغوي سريع ويتعامل مع السيناريوهات الشائعة ، بما في ذلك البحث عن النص الكامل والبحث المصفى وذي الأوجه والبحث عن البادئة. تستخدم هذه المقالة أمثلة لتوضيح الاستخدام البسيط لبناء الجملة في طلب " مستندات البحث" (REST API ).

ملاحظة

بناء جملة الاستعلام البديل هو Full Lucene، الذي يدعم هياكل استعلام أكثر تعقيدا، مثل البحث الضبابي وبحث أحرف البدل. لمزيد من المعلومات والأمثلة، راجع استخدام بناء جملة Lucene الكامل.

فهرس عينة الفنادق

تستند الاستعلامات التالية إلى فهرس عينة الفنادق، والذي يمكنك إنشاؤه باتباع الإرشادات الواردة في هذه البداية السريعة.

يتم توضيح استعلامات الأمثلة باستخدام طلبات REST API و POST. يمكنك لصقها وتشغيلها في Postman أو في رمز Visual Studio باستخدام ملحق البحث المعرفي.

يجب أن تحتوي رؤوس الطلبات على القيم التالية:

المفتاح القيمة
نوع المحتوى تطبيق/json
مفتاح واجهة برمجة التطبيقات <your-search-service-api-key>، إما الاستعلام أو مفتاح المسؤول

يجب أن تتضمن معلمات URI نقطة نهاية خدمة البحث مع اسم الفهرس ومجموعات المستندات وأمر البحث وإصدار واجهة برمجة التطبيقات، على غرار المثال التالي:

https://{{service-name}}.search.windows.net/indexes/hotels-sample-index/docs/search?api-version=2020-06-30

يجب تشكيل هيئة الطلب على أنها JSON صالحة:

{
    "search": "*",
    "queryType": "simple",
    "select": "HotelId, HotelName, Category, Tags, Description",
    "count": true
}
  • "البحث" المعين إلى * هو استعلام غير محدد، يعادل البحث الفارغ أو الفارغ. إنه ليس مفيدا بشكل خاص ، ولكنه أبسط بحث يمكنك القيام به ، ويعرض جميع الحقول القابلة للاسترداد في الفهرس ، مع جميع القيم.

  • "queryType" المعين إلى "بسيط" هو الافتراضي ويمكن حذفه، ولكن يتم تضمينه لتعزيز أن أمثلة الاستعلام في هذه المقالة يتم التعبير عنها في بناء الجملة البسيط.

  • يتم استخدام "تحديد" المعين إلى قائمة حقول محددة بفواصل لتكوين نتائج البحث، بما في ذلك فقط تلك الحقول المفيدة في سياق نتائج البحث.

  • ترجع كلمة "count" عدد المستندات المطابقة لمعايير البحث. في سلسلة بحث فارغة، سيكون العدد هو جميع المستندات في الفهرس (50 في حالة فهرس عينة الفنادق).

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

POST /indexes/hotel-samples-index/docs/search?api-version=2020-06-30
{
    "search": "pool spa +airport",
    "searchMode": any,
    "queryType": "simple",
    "select": "HotelId, HotelName, Category, Description",
    "count": true
}

يميل البحث عن الكلمات الرئيسية الذي يتكون من مصطلحات أو عبارات مهمة إلى العمل بشكل أفضل. تخضع حقول السلسلة لتحليل النص أثناء الفهرسة والاستعلام ، مع إسقاط الكلمات غير الأساسية مثل "the" و "and" و "it". لمعرفة كيفية ترميز سلسلة استعلام في الفهرس، قم بتمرير السلسلة في استدعاء تحليل النص إلى الفهرس.

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

يجب أن تبدو الاستجابة لاستعلام "مسبح سبا + مطار" مشابهة للمثال التالي ، مقتطعة للإيجاز.

"@odata.count": 6,
"value": [
    {
        "@search.score": 7.3617697,
        "HotelId": "21",
        "HotelName": "Nova Hotel & Spa",
        "Description": "1 Mile from the airport.  Free WiFi, Outdoor Pool, Complimentary Airport Shuttle, 6 miles from the beach & 10 miles from downtown.",
        "Category": "Resort and Spa",
        "Tags": [
            "pool",
            "continental breakfast",
            "free parking"
        ]
    },
    {
        "@search.score": 2.5560288,
        "HotelId": "25",
        "HotelName": "Scottish Inn",
        "Description": "Newly Redesigned Rooms & airport shuttle.  Minutes from the airport, enjoy lakeside amenities, a resort-style pool & stylish new guestrooms with Internet TVs.",
        "Category": "Luxury",
        "Tags": [
            "24-hour front desk service",
            "continental breakfast",
            "free wifi"
        ]
    },
    {
        "@search.score": 2.2988036,
        "HotelId": "35",
        "HotelName": "Suites At Bellevue Square",
        "Description": "Luxury at the mall.  Located across the street from the Light Rail to downtown.  Free shuttle to the mall and airport.",
        "Category": "Resort and Spa",
        "Tags": [
            "continental breakfast",
            "air conditioning",
            "24-hour front desk service"
        ]
    }

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

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

مثال 2: البحث عن طريق المعرف

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

GET /indexes/hotels-sample-index/docs/41?api-version=2020-06-30

تحتوي جميع المستندات على معرف فريد. إذا كنت تستخدم البوابة الإلكترونية، فحدد الفهرس من علامة التبويب الفهارس ثم انظر إلى تعريفات الحقول لتحديد الحقل الذي يمثل المفتاح. باستخدام REST، يقوم استدعاء الحصول على فهرس بإرجاع تعريف الفهرس في نص الاستجابة.

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

{
    "HotelId": "41",
    "HotelName": "Ocean Air Motel",
    "Description": "Oceanfront hotel overlooking the beach features rooms with a private balcony and 2 indoor and outdoor pools. Various shops and art entertainment are on the boardwalk, just steps away.",
    "Description_fr": "L'hôtel front de mer surplombant la plage dispose de chambres avec balcon privé et 2 piscines intérieures et extérieures. Divers commerces et animations artistiques sont sur la promenade, à quelques pas.",
    "Category": "Budget",
    "Tags": [
        "pool",
        "air conditioning",
        "bar"
    ],
    "ParkingIncluded": true,
    "LastRenovationDate": "1951-05-10T00:00:00Z",
    "Rating": 3.5,
    "Location": {
        "type": "Point",
        "coordinates": [
            -157.846817,
            21.295841
        ],
        "crs": {
            "type": "name",
            "properties": {
                "name": "EPSG:4326"
            }
        }
    },
    "Address": {
        "StreetAddress": "1450 Ala Moana Blvd 2238 Ala Moana Ctr",
        "City": "Honolulu",
        "StateProvince": "HI",
        "PostalCode": "96814",
        "Country": "USA"
    },

مثال 3: التصفية على النص

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

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

POST /indexes/hotels-sample-index/docs/search?api-version=2020-06-30
{
    "search": "art tours",
    "queryType": "simple",
    "filter": "Category eq 'Resort and Spa'",
    "select": "HotelId,HotelName,Description,Category",
    "count": true
}

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

{
    "@search.score": 2.8576312,
    "HotelId": "31",
    "HotelName": "Santa Fe Stay",
    "Description": "Nestled on six beautifully landscaped acres, located 2 blocks from the Plaza. Unwind at the spa and indulge in art tours on site.",
    "Category": "Resort and Spa"
}

مثال 4: دالات التصفية

يمكن أن تتضمن تعبيرات التصفية وظيفتي "search.ismatch" و"search.ismatchscoring"، مما يسمح لك بإنشاء استعلام بحث داخل عامل التصفية. يستخدم تعبير المرشح هذا حرف بدل مجاني لتحديد وسائل الراحة بما في ذلك خدمة الواي فاي المجانية ومواقف مجانية للسيارات وما إلى ذلك.

POST /indexes/hotels-sample-index/docs/search?api-version=2020-06-30
  {
    "search": "",
    "filter": "search.ismatch('free*', 'Tags', 'full', 'any')",
    "select": "HotelId, HotelName, Category, Description",
    "count": true
  }

تتطابق الإجابة على الاستعلام أعلاه مع 19 فندقا توفر وسائل راحة مجانية. لاحظ أن درجة البحث هي "1.0" موحدة في جميع أنحاء النتائج. ويرجع ذلك إلى أن تعبير البحث فارغ أو فارغ، مما يؤدي إلى تطابقات عامل التصفية الحرفي، ولكن لا يوجد بحث في النص الكامل. يتم إرجاع درجات الصلة فقط في البحث عن النص الكامل. إذا كنت تستخدم فلاتر بدون "بحث"، فتأكد من أن لديك حقولا كافية قابلة للفرز حتى تتمكن من التحكم في ترتيب البحث.

"@odata.count": 19,
"value": [
    {
        "@search.score": 1.0,
        "HotelId": "31",
        "HotelName": "Santa Fe Stay",
        "Tags": [
            "view",
            "restaurant",
            "free parking"
        ]
    },
    {
        "@search.score": 1.0,
        "HotelId": "27",
        "HotelName": "Super Deluxe Inn & Suites",
        "Tags": [
            "bar",
            "free wifi"
        ]
    },
    {
        "@search.score": 1.0,
        "HotelId": "39",
        "HotelName": "Whitefish Lodge & Suites",
        "Tags": [
            "continental breakfast",
            "free parking",
            "free wifi"
        ]
    },
    {
        "@search.score": 1.0,
        "HotelId": "11",
        "HotelName": "Regal Orb Resort & Spa",
        "Tags": [
            "free wifi",
            "restaurant",
            "24-hour front desk service"
        ]
    },

مثال 5: مرشحات النطاق

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

الاستعلام التالي هو نطاق رقمي. في فهرس عينة الفنادق، الحقل الرقمي الوحيد القابل للتصفية هو التصنيف.

POST /indexes/hotels-sample-index/docs/search?api-version=2020-06-30
{
    "search": "*",
    "filter": "Rating ge 2 and Rating lt 4",
    "select": "HotelId, HotelName, Rating",
    "orderby": "Rating desc",
    "count": true
}

يجب أن تبدو الاستجابة لهذا الاستعلام مشابهة للمثال التالي ، مقتطعة للإيجاز.

"@odata.count": 27,
"value": [
    {
        "@search.score": 1.0,
        "HotelId": "22",
        "HotelName": "Stone Lion Inn",
        "Rating": 3.9
    },
    {
        "@search.score": 1.0,
        "HotelId": "25",
        "HotelName": "Scottish Inn",
        "Rating": 3.8
    },
    {
        "@search.score": 1.0,
        "HotelId": "2",
        "HotelName": "Twin Dome Motel",
        "Rating": 3.6
    }

الاستعلام التالي هو عامل تصفية نطاق عبر حقل سلسلة (العنوان/مقاطعة الولاية):

POST /indexes/hotels-sample-index/docs/search?api-version=2020-06-30
{
    "search": "*",
    "filter": "Address/StateProvince ge 'A*' and Address/StateProvince lt 'D*'",
    "select": "HotelId, HotelName, Address/StateProvince",
    "count": true
}

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

"@odata.count": 9,
"value": [
    {
        "@search.score": 1.0,
        "HotelId": "9",
        "HotelName": "Smile Hotel",
        "Address": {
            "StateProvince": "CA "
        }
    },
    {
        "@search.score": 1.0,
        "HotelId": "39",
        "HotelName": "Whitefish Lodge & Suites",
        "Address": {
            "StateProvince": "CO"
        }
    },
    {
        "@search.score": 1.0,
        "HotelId": "7",
        "HotelName": "Countryside Resort",
        "Address": {
            "StateProvince": "CA "
        }
    },

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

POST /indexes/v/docs/search?api-version=2020-06-30
{
    "search": "*",
    "filter": "geo.distance(Location, geography'POINT(-122.335114 47.612839)') le 10",
    "select": "HotelId, HotelName, Address/City, Address/StateProvince",
    "count": true
}

ترجع الإجابة على هذا الاستعلام جميع الفنادق الواقعة على مسافة 10 كيلومترات من الإحداثيات المتوفرة:

{
    "@odata.count": 3,
    "value": [
        {
            "@search.score": 1.0,
            "HotelId": "45",
            "HotelName": "Arcadia Resort & Restaurant",
            "Address": {
                "City": "Seattle",
                "StateProvince": "WA"
            }
        },
        {
            "@search.score": 1.0,
            "HotelId": "24",
            "HotelName": "Gacc Capital",
            "Address": {
                "City": "Seattle",
                "StateProvince": "WA"
            }
        },
        {
            "@search.score": 1.0,
            "HotelId": "16",
            "HotelName": "Double Sanctuary Resort",
            "Address": {
                "City": "Seattle",
                "StateProvince": "WA"
            }
        }
    ]
}

مثال 7: المنطقيون مع وضع البحث

يدعم بناء الجملة البسيط عوامل التشغيل المنطقية في شكل أحرف (+, -, |) لدعم منطق AND و OR وليس منطق الاستعلام. يتصرف البحث المنطقي كما قد تتوقع ، مع بعض الاستثناءات الجديرة بالملاحظة.

في الأمثلة السابقة ، تم تقديم معلمة "searchMode" كآلية للتأثير على الدقة والتذكر ، مع تفضيل "searchMode = any" للاستدعاء (يعتبر المستند الذي يلبي أيا من المعايير مطابقا) ، و "searchMode = all" يفضل الدقة (يجب مطابقة جميع المعايير في مستند).

في سياق البحث المنطقي ، يمكن أن يكون "searchMode = any" الافتراضي مربكا إذا كنت تقوم بتكديس استعلام مع عوامل تشغيل متعددة والحصول على نتائج أوسع بدلا من نتائج أضيق. وينطبق هذا بشكل خاص على NOT، حيث تشمل النتائج جميع الوثائق "التي لا تحتوي على" مصطلح أو عبارة محددة.

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

لاحظ أنه لا توجد مسافة بين المشغل المنطقي (-) وعبارة "تكييف الهواء".

POST /indexes/hotels-sample-index/docs/search?api-version=2020-06-30
{
    "search": "restaurant -\"air conditioning\"",
    "searchMode": "any",
    "searchFields": "Tags",
    "select": "HotelId, HotelName, Tags",
    "count": true
}

التغيير إلى "searchMode=all" يفرض تأثيرا تراكميا على المعايير وإرجاع مجموعة نتائج أصغر (7 تطابقات) تتكون من مستندات تحتوي على مصطلح "مطعم" ، مطروحا منها تلك التي تحتوي على عبارة "تكييف الهواء".

ستبدو الاستجابة لهذا الاستعلام الآن مشابهة للمثال التالي ، مقتطعا للإيجاز.

"@odata.count": 7,
"value": [
    {
        "@search.score": 2.5460577,
        "HotelId": "11",
        "HotelName": "Regal Orb Resort & Spa",
        "Tags": [
            "free wifi",
            "restaurant",
            "24-hour front desk service"
        ]
    },
    {
        "@search.score": 2.166792,
        "HotelId": "10",
        "HotelName": "Countryside Hotel",
        "Tags": [
            "24-hour front desk service",
            "coffee in lobby",
            "restaurant"
        ]
    },

مثال 8: نتائج ترحيل الصفحات

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

بشكل افتراضي، تعرض خدمة البحث أفضل 50 مطابقة. للتحكم في عدد التطابقات في كل صفحة، استخدم "أعلى" لتحديد حجم الدفعة، ثم استخدم "تخطي" لالتقاط الدفعات اللاحقة.

يستخدم المثال التالي عامل تصفية وترتيب فرز في حقل التقييم (التصنيف قابل للتصفية والفرز) لأنه من الأسهل رؤية تأثيرات ترحيل الصفحات على النتائج التي تم فرزها. في استعلام بحث كامل منتظم، يتم ترتيب أهم المباريات وتقسيمها إلى صفحات حسب "@search.score".

POST /indexes/hotels-sample-index/docs/search?api-version=2020-06-30
{
    "search": "*",
    "filter": "Rating gt 4",
    "select": "HotelName, Rating",
    "orderby": "Rating desc",
    "top": "5",
    "count": true
}

يعثر الاستعلام على 21 مستندا مطابقا، ولكن نظرا لأنك حددت "أعلى"، فإن الاستجابة ترجع فقط أفضل خمس تطابقات، مع تقييمات تبدأ من 4.9، وتنتهي عند 4.7 مع "Lady of the Lake B B & ".

للحصول على ال 5 التالية، تخطى الدفعة الأولى:

POST /indexes/hotels-sample-index/docs/search?api-version=2020-06-30
{
    "search": "*",
    "filter": "Rating gt 4",
    "select": "HotelName, Rating",
    "orderby": "Rating desc",
    "top": "5",
    "skip": "5",
    "count": true
}

تتخطى الاستجابة للدفعة الثانية المباريات الخمس الأولى ، وتعود المباريات الخمس التالية ، بدءا من "Pull'r Inn Motel". للمتابعة مع دفعات إضافية ، ستحتفظ ب "أعلى" عند 5 ، ثم تزيد "تخطي" بمقدار 5 في كل طلب جديد (تخطي = 5 ، تخطي = 10 ، تخطي = 15 ، وما إلى ذلك).

"value": [
    {
        "@search.score": 1.0,
        "HotelName": "Pull'r Inn Motel",
        "Rating": 4.7
    },
    {
        "@search.score": 1.0,
        "HotelName": "Sublime Cliff Hotel",
        "Rating": 4.6
    },
    {
        "@search.score": 1.0,
        "HotelName": "Antiquity Hotel",
        "Rating": 4.5
    },
    {
        "@search.score": 1.0,
        "HotelName": "Nordick's Motel",
        "Rating": 4.5
    },
    {
        "@search.score": 1.0,
        "HotelName": "Winter Panorama Resort",
        "Rating": 4.5
    }
]

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

الآن بعد أن أصبح لديك بعض الممارسة مع بناء جملة الاستعلام الأساسي ، حاول تحديد الاستعلامات في التعليمات البرمجية. توضح الارتباطات التالية كيفية إعداد استعلامات البحث باستخدام Azure SDKs.

يمكن العثور على مرجع بناء جملة إضافي وبنية استعلام وأمثلة في الارتباطات التالية: