إضافة التنقل ذي الأوجه إلى تطبيق بحث
يستخدم التنقل ذو الأوجه لتصفية التنقل الموجه ذاتيا على نتائج الاستعلام في تطبيق البحث، حيث يوفر تطبيقك عناصر تحكم في النموذج لتحديد نطاق البحث إلى مجموعات من المستندات (على سبيل المثال، الفئات أو العلامات التجارية)، ويوفر Azure Cognitive Search هياكل البيانات والفلاتر لدعم التجربة.
في هذه المقالة، تعرف على الخطوات الأساسية لإنشاء بنية تنقل ذات أوجه في Azure Cognitive Search.
- تعيين سمات الحقل في الفهرس
- هيكلة الطلب والاستجابة
- إضافة عناصر تحكم التنقل والفلاتر في طبقة العرض التقديمي
يقوم الرمز الموجود في طبقة العرض التقديمي بالرفع الثقيل في تجربة التنقل ذات الأوجه. توفر العروض التوضيحية والعينات المدرجة في نهاية هذه المقالة تعليمات برمجية عمل توضح لك كيفية جمع كل شيء معا.
التنقل عبر الأوجه في صفحة بحث
الجوانب ديناميكية ويتم إرجاعها في استعلام. تجلب استجابة البحث معها جميع فئات الأوجه المستخدمة للتنقل في المستندات في النتيجة. يتم تنفيذ الاستعلام أولا ، ثم يتم سحب الجوانب من النتائج الحالية وتجميعها في بنية تنقل ذات أوجه.
في البحث المعرفي ، تكون الجوانب عميقة بطبقة واحدة ولا يمكن أن تكون هرمية. إذا لم تكن معتادا على التنقل ذي الأوجه المنظم، فسيوضح المثال التالي مثالا على اليمين. تشير الأعداد إلى عدد التطابقات لكل جانب. يمكن تمثيل نفس المستند في جوانب متعددة.
يمكن أن تساعدك Facets في العثور على ما تبحث عنه ، مع ضمان عدم حصولك على نتائج صفرية. بصفتك مطورا ، تتيح لك الجوانب عرض معايير البحث الأكثر فائدة للتنقل في فهرس البحث.
تمكين الجوانب في الفهرس
يتم تمكين Faceting على أساس كل حقل على حدة في تعريف فهرس عند تعيين السمة "facetable" إلى true.
على الرغم من أنها ليست مطلوبة بشكل صارم ، إلا أنه يجب عليك أيضا تعيين السمة "القابلة للتصفية" حتى تتمكن من إنشاء الفلاتر الضرورية التي تدعم تجربة التنقل ذات الأوجه في تطبيق البحث الخاص بك.
يوضح المثال التالي لفهرس عينة "الفنادق" "facetable" و "قابل للتصفية" في حقول الكاردينالية المنخفضة التي تحتوي على قيم مفردة أو عبارات قصيرة: "الفئة" و "العلامات" و "التصنيف".
{
"name": "hotels",
"fields": [
{ "name": "hotelId", "type": "Edm.String", "key": true, "searchable": false, "sortable": false, "facetable": false },
{ "name": "Description", "type": "Edm.String", "filterable": false, "sortable": false, "facetable": false },
{ "name": "HotelName", "type": "Edm.String", "facetable": false },
{ "name": "Category", "type": "Edm.String", "filterable": true, "facetable": true },
{ "name": "Tags", "type": "Collection(Edm.String)", "filterable": true, "facetable": true },
{ "name": "Rating", "type": "Edm.Int32", "filterable": true, "facetable": true },
{ "name": "Location", "type": "Edm.GeographyPoint" }
]
}
اختيار الحقول
يمكن حساب الأوجه عبر حقول ذات قيمة واحدة بالإضافة إلى المجموعات. تتميز الحقول التي تعمل بشكل أفضل في التنقل ذي الأوجه بهذه الخصائص:
كاردينالية منخفضة (عدد صغير من القيم المميزة التي تتكرر في جميع أنحاء المستندات في مجموعة البحث)
قيم وصفية قصيرة (كلمة واحدة أو كلمتين) سيتم عرضها بشكل جيد في شجرة التنقل
تنتج محتويات الحقل ، وليس الحقل نفسه ، الجوانب في بنية التنقل ذات الأوجه. إذا كان الوجه عبارة عن حقل سلسلة اللون، فستكون الجوانب زرقاء وخضراء وأي قيمة أخرى لهذا الحقل.
كأفضل ممارسة ، تحقق من الحقول بحثا عن القيم الخالية أو الأخطاء الإملائية أو تناقضات الحالات والإصدارات المفردة والجمع من نفس الكلمة. لا تخضع المرشحات والجوانب للتحليل المعجمي أو التدقيق الإملائي ، مما يعني أن جميع قيم حقل "facetable" هي جوانب محتملة ، حتى لو كانت الكلمات تختلف بحرف واحد.
الإعدادات الافتراضية في REST وAzure SDKs
إذا كنت تستخدم إحدى مجموعات Azure SDK، فيجب أن تحدد التعليمات البرمجية كافة سمات الحقل. في المقابل، تحتوي واجهة برمجة تطبيقات REST على إعدادات افتراضية لسمات الحقول استنادا إلى نوع البيانات. أنواع البيانات التالية هي "قابلة للتصفية" و "facetable" بشكل افتراضي:
Edm.StringEdm.DateTimeOffsetEdm.BooleanEdm.Int32,Edm.Int64,Edm.Double- مجموعات من أي من الأنواع المذكورة أعلاه ، على سبيل المثال
Collection(Edm.String)أوCollection(Edm.Double)
لا يمكنك استخدام Edm.GeographyPoint أو Collection(Edm.GeographyPoint) حقول في التنقل ذي الأوجه. تعمل الجوانب بشكل أفضل في الحقول ذات الكاردينالية المنخفضة. نظرا لدقة الإحداثيات الجغرافية ، من النادر أن تكون أي مجموعتين من الإحداثيات متساوية في مجموعة بيانات معينة. على هذا النحو ، لا يتم دعم الجوانب للإحداثيات الجغرافية. ستحتاج إلى حقل مدينة أو منطقة للعرض حسب الموقع.
تلميح
كأفضل ممارسة لتحسين الأداء والتخزين، قم بإيقاف تشغيل الواجهات للحقول التي لا ينبغي أبدا استخدامها كوجه. على وجه الخصوص، يجب تعيين "facetable": false حقول السلسلة للقيم الفريدة، مثل المعرف أو اسم المنتج، لمنع استخدامها العرضي (وغير الفعال) في التنقل ذي الأوجه. ينطبق هذا بشكل خاص على واجهة برمجة تطبيقات REST التي تمكن الفلاتر والجوانب افتراضيا.
طلب الوجه والاستجابة
يتم تحديد الأوجه في الاستعلام، ويتم إرجاع بنية التنقل ذات الأوجه في أعلى الاستجابة. هيكل الطلب والاستجابة بسيط إلى حد ما. في الواقع ، يكمن العمل الحقيقي وراء التنقل ذي الأوجه في طبقة العرض التقديمي ، التي يتم تغطيتها في قسم لاحق.
مثال REST التالي هو استعلام غير مؤهل () تم تحديد نطاقه إلى الفهرس بأكمله ("search": "*"راجع نموذج الفنادق المضمنة). عادة ما تكون الأوجه عبارة عن قائمة بالحقول، ولكن يعرض هذا الاستعلام حقلا واحدا فقط للحصول على استجابة أكثر قابلية للقراءة أدناه.
POST https://{{service_name}}.search.windows.net/indexes/hotels/docs/search?api-version={{api_version}}
{
"search": "*",
"queryType": "simple",
"select": "",
"searchFields": "",
"filter": "",
"facets": [ "Category"],
"orderby": "",
"count": true
}
من المفيد تهيئة صفحة بحث باستخدام استعلام مفتوح لملء بنية التنقل ذات الأوجه بالكامل. بمجرد اجتياز مصطلحات الاستعلام في الطلب، سيتم تحديد نطاق بنية التنقل ذات الأوجه بحيث تقتصر على التطابقات في النتائج فقط، بدلا من الفهرس بأكمله.
تتضمن الاستجابة للمثال أعلاه بنية التنقل ذات الأوجه في الأعلى. يتكون الهيكل من قيم "الفئة" وعدد الفنادق لكل منها. تليها بقية نتائج البحث ، التي تم قصها هنا للإيجاز. يعمل هذا المثال بشكل جيد لعدة أسباب. يقع عدد جوانب هذا الحقل تحت الحد الأقصى (الافتراضي هو 10) لذلك تظهر جميعها ، ويتم تمثيل كل فندق في مؤشر 50 فندقا في واحدة بالضبط من هذه الفئات.
{
"@odata.context": "https://demo-search-svc.search.windows.net/indexes('hotels')/$metadata#docs(*)",
"@odata.count": 50,
"@search.facets": {
"Category": [
{
"count": 13,
"value": "Budget"
},
{
"count": 12,
"value": "Resort and Spa"
},
{
"count": 9,
"value": "Luxury"
},
{
"count": 7,
"value": "Boutique"
},
{
"count": 5,
"value": "Suite"
},
{
"count": 4,
"value": "Extended-Stay"
}
]
},
"value": [
{
"@search.score": 1.0,
"HotelId": "1",
"HotelName": "Secret Point Motel",
"Description": "The hotel is ideally located on the main commercial artery of the city in the heart of New York. A few minutes away is Time's Square and the historic centre of the city, as well as other places of interest that make New York one of America's most attractive and cosmopolitan cities.",
"Category": "Boutique",
"Tags": [
"pool",
"air conditioning",
"concierge"
],
"ParkingIncluded": false,
. . .
بناء جملة الجوانب
يتم تعيين معلمة استعلام الوجه إلى قائمة محددة بفواصل من الحقول "facetable" واعتمادا على نوع البيانات ، يمكن وضع معلمات إضافية لتعيين الأعداد وترتيب الفرز والنطاقات: count:<integer>و ، ، interval:<integer>، sort:<>و values:<list>. لمزيد من التفاصيل حول معلمات الوجه، راجع " معلمات الاستعلام" في واجهة برمجة تطبيقات REST.
POST https://{{service_name}}.search.windows.net/indexes/hotels/docs/search?api-version={{api_version}}
{
"search": "*",
"facets": [ "Category", "Tags,count:5", "Rating,values:1|2|3|4|5"],
"count": true
}
لكل شجرة تنقل ذات أوجه ، هناك حد افتراضي يبلغ 10 أوجه. هذا الإعداد الافتراضي منطقي لهياكل التنقل لأنه يحتفظ بقائمة القيم بحجم يمكن التحكم فيه. يمكنك تجاوز الإعداد الافتراضي عن طريق تعيين قيمة إلى "count". على سبيل المثال، "Tags,count:5" تقليل عدد العلامات ضمن قسم العلامات إلى الخمسة الأوائل.
بالنسبة للقيم الرقمية وقيم DateTime فقط، يمكنك تعيين قيم بشكل صريح في حقل الوجه (على سبيل المثال، facet=Rating,values:1|2|3|4|5) لفصل النتائج إلى نطاقات متجاورة (إما نطاقات تستند إلى قيم رقمية أو فترات زمنية). بدلا من ذلك ، يمكنك إضافة "الفاصل الزمني:، كما في facet=Rating,interval:1.
يتم إنشاء كل نطاق باستخدام 0 كنقطة بداية، وقيمة من القائمة كنقطة نهاية، ثم يتم قصها من النطاق السابق لإنشاء فواصل زمنية منفصلة.
التناقضات في تعداد الأوجه
في ظل ظروف معينة، قد تجد أن عدد الأوجه لا يتطابق مع مجموعات النتائج (راجع التنقل عبر الأوجه في البحث المعرفي في Azure (صفحة أسئلة Microsoft QA&)).
يمكن أن تكون أعداد الأوجه غير دقيقة بسبب بنية التقسيم. يحتوي كل فهرس بحث على شظايا متعددة ، ويبلغ كل شظية عن أهم جوانب N حسب عدد المستندات ، والتي يتم دمجها بعد ذلك في نتيجة واحدة. إذا كانت بعض الشظايا تحتوي على العديد من القيم المتطابقة ، في حين أن البعض الآخر يحتوي على عدد أقل ، فقد تجد أن بعض القيم الجانبية مفقودة أو غير محسوبة في النتائج.
على الرغم من أن هذا السلوك يمكن أن يتغير في أي وقت، إذا واجهت هذا السلوك اليوم، يمكنك كمحاولة للتغلب عليه عن طريق تضخيم count:<number> بشكل مصطنع إلى عدد كبير لفرض إعداد التقارير الكاملة من كل شظية. إذا كانت قيمة العد: أكبر من أو تساوي عدد القيم الفريدة في الحقل، فنضمن لك نتائج دقيقة. ومع ذلك ، عندما يكون عدد المستندات مرتفعا ، فهناك عقوبة أداء ، لذا استخدم هذا الخيار بحكمة.
طبقة العرض التقديمي
في التعليمات البرمجية للتطبيق ، يتمثل النمط في استخدام معلمات استعلام الوجه لإرجاع بنية التنقل ذات الأوجه إلى جانب نتائج الوجه ، بالإضافة إلى تعبير $filter. يعالج تعبير عامل التصفية حدث النقر ويضيق نتيجة البحث بشكل أكبر استنادا إلى تحديد الوجه.
مزيج من الأوجه والفلتر
يضيف مقتطف التعليمات البرمجية التالي من الملف في العرض التوضيحي ل NYCJobs عنوان النشاط التجاري المحدد إلى عامل التصفية إذا قمت بتحديد قيمة من JobsSearch.cs وجه عنوان العمل.
if (businessTitleFacet != "")
filter = "business_title eq '" + businessTitleFacet + "'";
فيما يلي مثال آخر من عينة الفنادق. يضيف مقتطف التعليمات البرمجية التالي categorFacet إلى عامل التصفية إذا قام مستخدم بتحديد قيمة من وجه الفئة.
if (!String.IsNullOrEmpty(categoryFacet))
filter = $"category eq '{categoryFacet}'";
HTML للتنقل بين الأوجه
يوضح المثال التالي ، المأخوذ index.cshtml من ملف تطبيق نموذج NYCJobs ، بنية HTML الثابتة لعرض التنقل ذي الأوجه في صفحة نتائج البحث. يتم إنشاء قائمة الجوانب أو إعادة إنشائها ديناميكيا عند إرسال مصطلح بحث، أو تحديد وجه أو مسحه.
<div class="widget sidebar-widget jobs-filter-widget">
<h5 class="widget-title">Filter Results</h5>
<p id="filterReset"></p>
<div class="widget-content">
<h6 id="businessTitleFacetTitle">Business Title</h6>
<ul class="filter-list" id="business_title_facets">
</ul>
<h6>Location</h6>
<ul class="filter-list" id="posting_type_facets">
</ul>
<h6>Posting Type</h6>
<ul class="filter-list" id="posting_type_facets"></ul>
<h6>Minimum Salary</h6>
<ul class="filter-list" id="salary_range_facets">
</ul>
</div>
</div>
إنشاء HTML ديناميكيا
يقوم مقتطف التعليمات البرمجية التالي من العرض التوضيحي index.cshtml (أيضا من NYCJobs) بإنشاء HTML ديناميكيا لعرض الجانب الأول ، عنوان العمل. وظائف مماثلة بناء ديناميكيا HTML للجوانب الأخرى. يحتوي كل جانب على ملصق وعدد ، والذي يعرض عدد العناصر التي تم العثور عليها لنتيجة هذا الجانب.
function UpdateBusinessTitleFacets(data) {
var facetResultsHTML = '';
for (var i = 0; i < data.length; i++) {
facetResultsHTML += '<li><a href="javascript:void(0)" onclick="ChooseBusinessTitleFacet(\'' + data[i].Value + '\');">' + data[i].Value + ' (' + data[i].Count + ')</span></a></li>';
}
$("#business_title_facets").html(facetResultsHTML);
}
تلميحات للعمل مع الجوانب
هذا القسم عبارة عن مجموعة من النصائح والحلول التي قد تكون مفيدة.
الحفاظ على بنية التنقل الجانبي بشكل غير متزامن للنتائج التي تمت تصفيتها
أحد تحديات التنقل بين الأوجه في Azure Cognitive Search هو أن الجوانب موجودة للنتائج الحالية فقط. في الممارسة العملية ، من الشائع الاحتفاظ بمجموعة ثابتة من الجوانب بحيث يمكن للمستخدم التنقل في الاتجاه المعاكس ، وتتبع الخطوات لاستكشاف مسارات بديلة من خلال محتوى البحث.
على الرغم من أن هذه حالة استخدام شائعة ، إلا أنها ليست شيئا توفره بنية التنقل ذات الأوجه حاليا خارج الصندوق. عادة ما يعمل المطورون الذين يريدون جوانب ثابتة على القيد عن طريق إصدار استعلامين تمت تصفيتهم: أحدهما محدد النطاق إلى النتائج ، والآخر يستخدم لإنشاء قائمة ثابتة من الجوانب لأغراض التنقل.
جوانب واضحة
عند تصميم صفحة نتائج البحث، تذكر إضافة آلية لمسح الجوانب. إذا أضفت خانات اختيار، يمكنك بسهولة معرفة كيفية إلغاء تحديد عوامل التصفية. بالنسبة للتخطيطات الأخرى، قد تحتاج إلى نمط مسارات التنقل أو نهج إبداعي آخر. في نموذج الفنادق C#، يمكنك إرسال بحث فارغ لإعادة تعيين الصفحة. في المقابل ، يوفر تطبيق نموذج NYCJobs إمكانية [X] النقر بعد وجه محدد لمسح الوجه ، وهو قائمة انتظار مرئية أقوى للمستخدم.
تقليم النتائج الجانبية مع المزيد من الفلاتر
النتائج الوجهية هي مستندات موجودة في نتائج البحث تتطابق مع مصطلح الوجه. في المثال التالي، في نتائج البحث للحوسبة السحابية، يحتوي 254 عنصرا أيضا على مواصفات داخلية كنوع محتوى. والبنود ليست بالضرورة متعارضة مع بعضها البعض. إذا كان العنصر يفي بمعايير كلا المرشحين، احتسابه في كل منهما. هذه الازدواجية ممكنة عند مواجهة الحقول ، والتي غالبا ما تستخدم لتنفيذ وضع علامات على Collection(Edm.String) المستندات.
Search term: "cloud computing"
Content type
Internal specification (254)
Video (10)
بشكل عام، إذا وجدت أن النتائج الجانبية كبيرة جدا باستمرار، فإننا نوصي بإضافة المزيد من الفلاتر لمنح المستخدمين المزيد من الخيارات لتضييق نطاق البحث.
تجربة بحث للجوانب فقط
إذا كان تطبيقك يستخدم التنقل ذي الأوجه حصريا (أي بدون مربع بحث)، فيمكنك وضع علامة على الحقل على أنه searchable=false، facetable=truefilterable=trueلإنتاج فهرس أكثر إحكاما. لن يتضمن فهرسك فهارس مقلوبة ولن يكون هناك تحليل للنص أو ترميز مميز. يتم إجراء الفلاتر على تطابقات تامة على مستوى الشخصية.
التحقق من صحة المدخلات في وقت الاستعلام
إذا قمت بإنشاء قائمة الجوانب ديناميكيا استنادا إلى إدخال مستخدم غير موثوق به، فتحقق من صحة أسماء الحقول ذات الأوجه. أو يمكنك الهروب من الأسماء عند إنشاء عناوين URL باستخدام إما Uri.EscapeDataString() في .NET أو ما يعادلها في النظام الأساسي الذي تختاره.
العروض التوضيحية والعينات
وتشمل عدة عينات التنقل الأوجه. يحتوي هذا القسم على ارتباطات إلى العينات ويلاحظ أيضا مكتبة العميل واللغة المستخدمة لكل منها.
إنشاء تطبيقك الأول في C # (Razor)
يتضمن هذا البرنامج التعليمي وسلسلة العينات في C # درسا يركز على التنقل بين الأوجه. الحل عبارة عن تطبيق MVC ASP.NET وتستخدم طبقة العرض التقديمي مكتبات عميل Razor.
إضافة بحث إلى تطبيقات الويب (React)
تتضمن البرامج التعليمية والعينات في C # و Python و JavaScript التنقل ذي الأوجه بالإضافة إلى الفلاتر والاقتراحات والإكمال التلقائي. تستخدم هذه العينات React لطبقة العرض التقديمي.
NYCJobs نموذج التعليمات البرمجية والعرض التوضيحي (أياكس)
نموذج NYCJobs هو تطبيق MVC ASP.NET يستخدم Ajax في طبقة العرض التقديمي. وهي متوفرة كتطبيق تجريبي مباشر وكشفرة مصدر على إعادة الشراء في Azure-Samples على GitHub.