
إذا كان أي من مشاريعك يستخدم البيانات المخزنة في قاعدة بيانات Azhurov ، فمن الممكن تمامًا أن تتاح لك فرصة استخدام البحث عن البيانات باستخدام البحث Azure. لا يمكنك البحث فقط عن طريق قواعد البيانات (Azure Cosmos DB ، Azure SQL Database ، SQL Server المستضافة في Azure VM) ، ولكن أيضًا بواسطة Blob (تخزين Azure Blob ، تخزين Azure Table).
يحتوي البحث على تعرفة مجانية ، والتي تتيح لك إنشاء ما يصل إلى ثلاثة فهارس بحجم إجمالي يصل إلى 50 ميجا بايت. لا تحتوي التعريفة المجانية على إمكانيات موازنة التحميل ، ولكنها مناسبة تمامًا للاستخدام.
بدا التعامل مع البحث بسيطًا جدًا بالنسبة لي (رغم أنه ليس واضحًا دائمًا). هناك 3 أنواع من الكائنات: مصدر البيانات والفهرس والمفهرس. الكائن الرئيسي ، ربما ، هو الفهرس. إنه المسؤول عن كيفية البحث وما الذي تبحث عنه بالضبط. مصدر البيانات هو اتصال بيانات ، والمفهرس هو مهمة تقوم بتحديث بيانات الفهرس.
تتيح لك واجهة مستخدم البوابة استيراد البيانات وإنشاء الكائنات الثلاثة جميعها. ستكون الفرصة في تمرير وإضافة القدرات المعرفية إلى البحث. إذا كانت قاعدة بيانات SQL في الاشتراك ، فيمكنك تحديدها عند إنشاء مصدر البيانات. على الرغم من كلمة المرور لسبب ما ، لا يزال يتعين عليك إدخال. إذا كنت تريد استخدام Cosmos DB ، فستحتاج إلى إدخال سلسلة الاتصال يدويًا. لا تنس الإشارة إلى السطر وقاعدة البيانات ، مضيفًا في نهاية السطر قاعدة البيانات = YOUR_BASE_NAME
بعد اختيار مصدر بيانات ، سيُطلب منك استخدام قدرات البحث المعرفي. لا تزال مجموعة المهارات الافتراضية صغيرة جدًا: يمكنك تحديد اللغة واستخراج الأسماء وأسماء المؤسسات والأماكن والعبارات الرئيسية. هناك أيضًا فرصة مثيرة للاهتمام لتحديد طبيعة النص للمشاعر الإيجابية أو السلبية باستخدام اكتشاف المشاعر. يجب أن تكون هذه المهارة ملائمة للاستخدام مع مراجعات المنتجات في المتاجر عبر الإنترنت. من الممكن إنشاء مهاراتك الخاصة باستخدام وصف API.

بالنسبة للملفات التي يتم تحميلها إلى blob ، يكون التعرف الضوئي على الأحرف (OCR) ممكنًا. من الممكن التعرف على النص المكتوب بخط اليد (حتى الآن باللغة الإنجليزية فقط) والنص المطبوع. باستخدام الخدمات المعرفية ، من الممكن تحديد كائنات مختلفة في الصورة. على سبيل المثال ، الأماكن الشهيرة أو المشاهير.
والخطوة التالية هي إنشاء فهرس. الخيار الوحيد لوضع البحث هذا اليوم هو "analingInfixMatching"

في هذه المرحلة ، يمكنك تحديد المربعات بجوار الحقول في الجدول الخاص بك أو إضافة بعض الحقول الجديدة إلى الفهرس. فقط في حالة ، سأشرح إمكانيات الحقول:
يمكن استرجاعه - الحقل موجود في نتائج البحث
ترشيح - يمكن تصفية قيمة الحقل
قابل للفرز - يمكنك فرز النتيجة حسب هذا الحقل
Facetable - نوع من التجميع وفقًا لبعض الخصائص. على سبيل المثال ، باستخدام التعبير التالي facet = listPrice ، والقيم: 10 | 25 | 100 | 500 | 1000 | 2500 ، يمكنك الحصول على التفاصيل التالية للنتائج في مجموعات

يمكن البحث - سيتم البحث في هذا الحقل
يقترح حقل Analyzer اختيار محلل للغات متعددة. يتم استخدام إصدارات 2 - لوسين ومايكروسوفت . لفهم الفرق ، تحتاج إلى فهم الفرق بين المصطلحين التاليين:
Stamming هي عملية العثور على أساس كلمة لكلمة مصدر معينة. الجذعية (الإنجليزية) - الجذعية ، الجذعية ، الأصل. يستخدم الجذع الخوارزميات. غالبًا ما يقطع الكلمات عن طريق إزالة اللواحق والنهايات ، والحصول على أساس الكلمة.
Lemmatization هي عملية اختزال شكل كلمة إلى lemma - شكلها العادي (المفردات). ليما هي الشكل الأساسي الكنسي للكلمة. يستخدم Lemmatization بحث القاموس الذي يحتوي على أشكال مختلفة من الكلمات.
يستخدم محلل لوسين التقليل. مايكروسوفت محلل يستخدم اللمعة.
بشكل افتراضي ، إذا لم يتم تحديد أي شيء ، فسيتم استخدام Lucene. لكن إذا كنت تبحث عن بيانات بلغة معينة ، فمن الأفضل بلا شك استخدام محلل لهذه اللغة.
Suggester - يسمح لك بإعطاء تلميحات مع المستندات التي تحتوي على النص الذي تم إدخاله باستخدام الحروف الأولية للبحث.
إذا كنت تستخدم proester في Azure Search في تطبيق العميل ، فسيكون لديك خياران لاستخدامه: الموجه نفسه أو الإكمال التلقائي . باختصار ، يقترح الموجه تمامًا الصف بأكمله من حقل الجدول ، والإكمال التلقائي فقط يقدم لإكمال كلمة أو تعبير من كلمتين. تم توضيح أفضل مقال حول الاختلافات بين أوضاع المطالبة والإكمال التلقائي في المقالة التالية: الإكمال التلقائي في Azure البحث الآن في المعاينة العامة تحتوي هذه المقالة على صور بصرية جدًا.
في مرحلة إنشاء المفهرس ، يجب عليك تحديد عمود علامة مائية عالية . هذا حقل يتغير في كل مرة يتم فيها تغيير السجل. عادة ما يكون هذا كأنه حقل يشتمل على تاريخ التغيير الأخير أو حقل _ts في Cosmos DB. أثناء الفهرسة ، إذا تم تغيير قيمة الحقل ، فسيتم أيضًا تغيير الفهرس.

يعد تتبع عمليات الحذف خيارًا لحذف الإدخالات من الفهرس تلقائيًا. ولكن لهذا ، يجب أن يكون لديك حذف ناعم مكوّن في قاعدة البيانات الخاصة بك. إذا كنت تستخدم الحذف الناعم ، فعندما تقوم بحذف سجل ، لا يتم حذفه ، ولكن يتم تعليمه على أنه محذوف. يتمثل الخيار القياسي في إضافة حقل isDeleted إلى قاعدة البيانات وتعيينه على "صحيح" إذا تم حذف السجل.
بدلاً من ذلك ، في كل مرة تقوم فيها بحذف إدخال من قاعدة البيانات ، يمكنك إرسال طلب حذف من البحث إلى Azure Search API. في هذه الحالة ، يمكن حذف مربع اختيار حذف Trak. لكنني لا أحب هذا الخيار حقًا ، لأنه إذا لم ينجح طلب الحذف ، فسيظل السجل في الفهرس. بالنسبة لي ، ليست هناك فرصة كافية لإعادة بناء الفهرس مرة واحدة في فترة زمنية معينة تمامًا.
على الرغم من راحة البوابة ، يمكنك بعد إضافة بعض الحقول الجديدة إلى الفهرس ، ولكن لا يمكنك تغيير الحقول الموجودة. ماذا تفعل إذا كنت بحاجة إلى تغيير شيء ما؟ يمكنك إعادة إنشاء الفهرس. حذف واحد موجود وإنشاء واحدة جديدة تحتوي على التغييرات اللازمة. استخدام موقع البوابة للقيام بذلك يعد مهمة كئيبة إلى حد ما. أنا استخدم API لهذه الأغراض. باستخدام تطبيق مثل Postman ، يمكنك الحصول على الفهرس JSON واستخدامه لكتابة طلب إنشاء فهرس. من الضروري فقط إجراء تغييرات صغيرة (على سبيل المثال ، إزالة حقول النظام "@ odata.context" و "@ odata.etag").
من أجل العمل مع واجهة برمجة التطبيقات ، يجب أن تأخذ المفتاح من البوابة ، والذي يجب إضافته إلى رأس كل طلب من واجهات برمجة التطبيقات. المفتاح مأخوذ هنا:

استعلام الحصول على بيانات الفهرس هو:
GET https://[service name].search.windows.net/indexes/[index name]?api-version=[api-version]
يجب إضافة api-key: [admin key]
إلى الرأس api-key: [admin key]
يمكن إنشاء فهرس باستخدام أحد الاستفسارين التاليين:
POST https://[servicename].search.windows.net/indexes?api-version=[api-version] Content-Type: application/json api-key: [admin key]
أو
PUT https://[servicename].search.windows.net/indexes/[index name]?api-version=[api-version]
في الجسم ، يجب عليك تحديد JSON مع محتويات الفهرس. أحدث إصدار في الوقت الحالي هو 2019-05-06 ، وقبل استخدامه لفترة طويلة 2017-11-11
من خلال استخدام واجهة برمجة التطبيقات ، يمكنك استخدام بعض ميزات البحث غير المتوفرة على البوابة.
لإعطاء بعض الحقول أولوية في البحث ، يمكنك استخدام ملفات تعريف التسجيل .
يوفر JSON التالي المضاف إلى الطلب لحقل "العنوان" ميزة مزدوجة على حقل "المعلومات":
"scoringProfiles": [ { "name": "profileForTitle", "document": { "weights": { "title": 2, “info": 1 } } ]
بالإضافة إلى القدرة على إعطاء بعض الحقول الأولوية باستخدام الأوزان ، من الممكن استخدام بعض الوظائف المحددة مسبقًا: النضارة والحجم والمسافة والعلامة.
يتم استخدام Freshness فقط مع حقول DateTime ويسمح لك بإظهار أحدث السجلات في البحث. يستخدم الحجم مع الحقول int و double. حسنًا ، ووفقًا لذلك ، تعد هذه الوظيفة جيدة للاستخدام مع الحقول التي تخزن الأسعار وعدد التنزيلات والمعلومات الرقمية الأخرى. يتم استخدام المسافة فقط مع الحقول مثل Edm.GeographyPoint ويتم رفعها في البحث عن طريق المسافة من موقع معين. إذا تم تحديد العلامة كنوع الوظيفة ، فسيتم رفع المستندات التي تحتوي على علامات تظهر في سلسلة البحث في البحث.
أحد الخيارات الأكثر شعبية هو التقاط أحدث المستندات في عملية بحث مثل هذا:
"scoringProfiles": [{ "name":"newDocs", "functions": [ { "type": "freshness", "fieldName": "documentDate", "boost": 10, "interpolation": "quadratic", "freshness": { "boostingDuration": "P7D" } } ] } ]
سيتم رفع الوثائق التي يحتوي حقل تاريخها على تاريخ الأيام السبعة الأخيرة ("P7D").
بعد قيامك بإنشاء ملف تعريف تسجيل ، يمكنك تحديد اسمه في الطلبات. فقط في هذه الحالة سيتم رفع الحقول اللازمة في البحث.
اقرأ المزيد في الوثائق الرسمية: أضف ملفات تعريف تسجيل إلى فهرس البحث Azure
سياسة الكشف عن تغيير البيانات
يوفر API ميزات أكثر قليلاً لمصدر البيانات. كما يمكنك أن تقرأ أعلاه ، عند إنشاء مصدر بيانات ، يمكنك تحديد حقل لتحديد ما إذا كانت البيانات قد تغيرت. في شكل JSON ، يبدو كما يلي:
"dataChangeDetectionPolicy" : { "@odata.type" : "#Microsoft.Azure.Search.HighWaterMarkChangeDetectionPolicy", "highWaterMarkColumnName" : "[a rowversion or last_updated column name]" } soft delete policy: "dataDeletionDetectionPolicy" : { "@odata.type" : "#Microsoft.Azure.Search.SoftDeleteColumnDeletionDetectionPolicy", "softDeleteColumnName" : "IsDeleted", "softDeleteMarkerValue" : "true" }
إذا كنت تستخدم SQL Server وتدعم قاعدة البيانات الخاصة بك تغيير التعقب ، فيمكن حذف السجلات المحذوفة من الفهرس تلقائيًا. تحديد highWaterMarkColumnName في هذه الحالة غير مطلوب. يكفي تحديد SqlIntegratedChangeTrackingPolicy بدلاً من HighWaterMarkChangeDetectionPolicy
"dataChangeDetectionPolicy" : { "@odata.type" : "#Microsoft.Azure.Search.SqlIntegratedChangeTrackingPolicy" }
انها مريحة جدا. ولكن هناك فروق دقيقة لا تسمح بالتمتع بهذه الميزة تمامًا.
أولاً ، لا يمكن استخدام SqlIntegratedChangeTrackingPolicy مع طرق العرض. ثانياً ، لا ينبغي أن يحتوي الجدول على مفاتيح أساسية مركبة. غني عن القول أن إصدار SQL Server يجب أن يكون أكثر أو أقل جديد. وأخيرًا ، يجب تمكين "تغيير التعقب" لقاعدة البيانات والجداول التي يستخدمها البحث. بالنسبة لقاعدة البيانات ، يتم تشغيلها مثل هذا:
ALTER DATABASE AdventureWorks2012 SET CHANGE_TRACKING = ON (CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON)
وللجدول مثل هذا:
ALTER TABLE Person.Contact ENABLE CHANGE_TRACKING WITH (TRACK_COLUMNS_UPDATED = ON)
لكن هذا ليس كل شيء. يوصى بشدة بتمكين عزل اللقطة للقاعدة.
ALTER DATABASE AdventureWorks2012 SET ALLOW_SNAPSHOT_ISOLATION ON;
بالإضافة إلى الرقص مع الدف عند تثبيت Change Traking لقاعدة البيانات الخاصة بي ، فإن العيب هو عدم القدرة على استخدام طرق العرض. لذلك لا يزال يتعين علي عادة استخدام HighWaterMarkChangeDetectionPolicy
بحث البيانات
بشكل افتراضي ، يستخدم البحث Azure بناء جملة استعلام بسيط . قد لا يبدو الأمر مفاجئًا ، لكنه بسيط جدًا:
يبحث wifi + فاخر عن الكلمات wifi ورفاهية في نفس الوقت
"فندق فاخر" يبحث عن العبارة
واي فاي | الرفاهية تبحث عن كلمة wifi أو كلمة رفاهية
يبحث wifi- الفاخرة عن نصوص مع كلمة wifi ولكن بدون كلمة ترف
يبحث lux عن الكلمات التي تبدأ بـ lux
من الممكن الجمع بين قواعد البحث باستخدام الأقواس. على سبيل المثال ، تبحث قاعدة motel + (wifi | luxury) عن الكلمة motel أو إما الكلمة wifi أو الكلمة الفاخرة
من الجميل أن يستخدم Azure Search بناء جملة Lucene . لاستخدامه ، من الضروري إضافة queryType = ممتلئ إلى استعلام البحث
الفرق بين Azure و Lucene الكلاسيكي بناء الجملة هو فقط في غياب النطاق.
إذن في Azure Search ، لا يمكنك: mod_date:[20020101 TO 20030101]
ولكن في Azure Search ، يمكنك استخدام فلتر $ مع بناء جملة ODATA . هنا مرشح مثال:
{ "name": "Scott", "filter": "(age ge 25 and and lt 50) or surname eq 'Guthrie'" }
يمكن استخدام المرشحات أيضًا مع بناء جملة استعلام بسيط.
في لوسين ، يتم تطبيق المنطق "أو" باستخدام OR أو ||
يمكن العثور على كلتا القيمتين عن طريق تحديد عبارة "و" مع: AND ، &&& +
من أجل "لا" يمكنك استخدام أحد الإجراءات التالية: لا ،! أو -
يحتوي التعليم "لا" على ميزة شائعة لكل من بناء الجملة البسيط ولوسين. يعتمد سلوكه على وضع البحث ، والذي يمكن تعيينه في searchMode = الكل وفي searchMode = أي (يتم استخدام هذه القيمة بشكل افتراضي). في أي وضع ، سيؤدي البحث عن wifi -luxury إلى العثور على مستندات تحتوي على كلمة wifi أو مستندات بدون كلمة luxury. في كل الوضع ، بناءً على نفس الطلب ، سيجد الاحواض بكلمة wifi وأيضاً بدون كلمة ترف.
دعونا نلقي نظرة على بعض ميزات Lucene المثيرة للاهتمام.
يتيح لك البحث الغامض البحث عن الكلمات التي تختلف عن البحث بحرف واحد أو أكثر. وهذا هو ، فإنه يساعد على التعامل مع الأخطاء المطبعية. على سبيل المثال ، البحث عن "blue ~" أو "blue ~ 1" سيعيدك بـ "blue" و "blues" وحتى "glue". ولكن في الوقت نفسه ، فإن البحث عن "محلل الأعمال ~" سوف يعني العمل أو المحلل
يسمح لك القرب بالبحث عن الكلمات القريبة. على سبيل المثال ، سيجد "hotel airport" ~ 5 الكلمات "hotel" و "airport" الموجودة في النص بما لا يتجاوز 5 كلمات عن بعضها البعض.
يتيح لك تعزيز المصطلح تعيين أولوية الكلمة في البحث. مثال: يبحث "rock ^ 2 electronic" عن الكلمات rock والإلكترونية ، ولكن سيتم عرض الإدخالات التي تحتوي على الكلمة rock في البحث أعلاه.
التعبيرات العادية - باستخدام التعبيرات العادية. كل شيء هنا يتوافق مع وثائق Lucene regex الرسمية. يمكنك العثور عليها عن طريق الرابط التالي . عند البحث ، يجب وضع تعبيرات منتظمة بين خطوط مائلة للأمام "/". على سبيل المثال ، مثل هذا: / [mh] فندق /
إذا كانت سلسلة البحث تحتوي على أحرف خاصة ، فيجب تخطيها بخط مائل عكسي. مثال على الأحرف المراد هربها: + - && ||! () {} [] ^ "~ * ؟: \ /
يمكن إجراء البحث باستخدام طلب GET. المثال الرسمي هو هذا:
GET /indexes/hotels/docs?search=category:budget AND \"recently renovated\"^3&searchMode=all&api-version=2019-05-06&querytype=full
ولكن يمكنك استخدام طلب POST مع النص الأساسي. مرة أخرى ، مثال رسمي:
POST /indexes/hotels/docs/search?api-version=2019-05-06 { "search": "category:budget AND \"recently renovated\"^3", "queryType": "full", "searchMode": "all" }
إذا كنت تستخدم طلب GET أو POST مع تطبيق نوع البيانات / x-www-form-urlencoded ، فأنت بحاجة إلى تشفير الأحرف غير الآمنة والمحجوزة.
الرموز؛ /؟: @ = & محجوز
الأحرف `` <> #٪ {} | \ ^ ~ [] غير آمنة.
على سبيل المثال ، سوف يصبح الرمز #٪ 23 والرمز؟ يصبح٪ 3F
زوجان من الروابط للمطورين.
إذا كان .NET مطورًا ، فيمكنك استخدام حزمة Microsoft.Azure.Search NuGet . بالإضافة إلى ذلك ، توجد أمثلة في NodeJS و Java .
مثال لتطبيق بسيط على .NET Core يمكنك أن تجد هنا عينة بحث ASP.NET Core Azure