نمذجة أنواع البيانات المعقدة في البحث المعرفي في Azure
يمكن أن تأتي مجموعات البيانات الخارجية المستخدمة لملء فهرس البحث المعرفي Azure بأشكال عديدة. في بعض الأحيان تشمل الهياكل الفرعية الهرمية أو المتداخلة. قد تتضمن الأمثلة عناوين متعددة لعميل واحد ، وألوان وأحجام متعددة لوحدة SKU واحدة ، ومؤلفين متعددين لكتاب واحد ، وما إلى ذلك. من حيث النمذجة، قد ترى هذه الهياكل يشار إليها باسم أنواع البيانات المعقدة أو المركبة أو المركبة أو المجمعة. يستخدم مصطلح Azure Cognitive Search لهذا المفهوم وهو نوع معقد. في Azure Cognitive Search، يتم نمذجة الأنواع المعقدة باستخدام حقول معقدة. الحقل المعقد هو حقل يحتوي على أطفال (حقول فرعية) يمكن أن تكون من أي نوع بيانات، بما في ذلك الأنواع المعقدة الأخرى. يعمل هذا بطريقة مشابهة لأنواع البيانات المنظمة في لغة برمجة.
تمثل الحقول المعقدة إما كائنا واحدا في الوثيقة، أو صفيفا من الكائنات، اعتمادا على نوع البيانات. تمثل حقول الكتابة كائنات مفردة، بينما تمثل حقول الكتابة Edm.ComplexTypeCollection(Edm.ComplexType) صفائف الكائنات.
يدعم Azure Cognitive Search أصلا الأنواع والمجموعات المعقدة. تسمح لك هذه الأنواع بنمذجة أي بنية JSON تقريبا في فهرس Azure Cognitive Search. في الإصدارات السابقة من واجهات برمجة تطبيقات البحث المعرفي في Azure، يمكن استيراد مجموعات الصفوف المسطحة فقط. في أحدث إصدار، يمكن أن يتوافق فهرسك الآن بشكل أوثق مع بيانات المصدر. بمعنى آخر، إذا كانت بيانات المصدر تحتوي على أنواع معقدة، فقد يحتوي فهرسك على أنواع معقدة أيضا.
للبدء، نوصي بمجموعة بيانات الفنادق، والتي يمكنك تحميلها في معالج استيراد البيانات في مدخل Azure. يكتشف المعالج الأنواع المعقدة في المصدر ويقترح مخطط فهرس استنادا إلى الهياكل المكتشفة.
ملاحظة
أصبح دعم الأنواع المعقدة متاحا بشكل عام بدءا من api-version=2019-05-06.
إذا كان حل البحث الخاص بك مبنيا على حلول سابقة لمجموعات البيانات المسطحة في مجموعة، فيجب عليك تغيير فهرسك لتضمين أنواع معقدة كما هو مدعوم في أحدث إصدار من واجهة برمجة التطبيقات. لمزيد من المعلومات حول ترقية إصدارات واجهة برمجة التطبيقات، راجع الترقية إلى أحدث إصدار من واجهة برمجة تطبيقات REST أو الترقية إلى أحدث إصدارمن .NET SDK.
مثال على بنية معقدة
يتكون مستند JSON التالي من حقول بسيطة وحقول معقدة. تحتوي الحقول المعقدة، مثل Address و Rooms، على حقول فرعية. Address يحتوي على مجموعة واحدة من القيم لتلك الحقول الفرعية، نظرا لأنه كائن واحد في المستند. في المقابل ، لديه مجموعات متعددة من القيم لحقوله الفرعية ، Rooms واحدة لكل كائن في المجموعة.
{
"HotelId": "1",
"HotelName": "Secret Point Motel",
"Description": "Ideally located on the main commercial artery of the city in the heart of New York.",
"Tags": ["Free wifi", "on-site parking", "indoor pool", "continental breakfast"],
"Address": {
"StreetAddress": "677 5th Ave",
"City": "New York",
"StateProvince": "NY"
},
"Rooms": [
{
"Description": "Budget Room, 1 Queen Bed (Cityside)",
"RoomNumber": 1105,
"BaseRate": 96.99,
},
{
"Description": "Deluxe Room, 2 Double Beds (City View)",
"Type": "Deluxe Room",
"BaseRate": 150.99,
}
. . .
]
}
فهرسة الأنواع المعقدة
أثناء الفهرسة، يمكنك الحصول على 3000 عنصر كحد أقصى عبر جميع المجموعات المعقدة داخل مستند واحد. عنصر من عناصر المجموعة المعقدة هو عضو في تلك المجموعة ، لذلك في حالة الغرف (المجموعة المعقدة الوحيدة في مثال الفندق) ، كل غرفة هي عنصر. في المثال أعلاه ، إذا كان "Secret Point Motel" يحتوي على 500 غرفة ، فستحتوي وثيقة الفندق على عناصر غرفة 500. بالنسبة للمجموعات المعقدة المتداخلة ، يتم أيضا حساب كل عنصر متداخل ، بالإضافة إلى العنصر الخارجي (الأصل).
ينطبق هذا الحد فقط على المجموعات المعقدة، وليس الأنواع المعقدة (مثل العنوان) أو مجموعات السلاسل (مثل العلامات).
إنشاء حقول معقدة
كما هو الحال مع أي تعريف فهرس، يمكنك استخدام البوابة الإلكترونية أو واجهة برمجة تطبيقات REST أو . NET SDK لإنشاء مخطط يتضمن أنواعا معقدة.
توفر مجموعات Azure SDK الأخرى عينات في Python و Java و JavaScript.
في صفحة نظرة عامة على خدمة البحث، حدد علامة التبويب الفهارس .
افتح فهرسا موجودا أو أنشئ فهرسا جديدا.
حدد علامة التبويب الحقول ، ثم حدد إضافة حقل. تتم إضافة حقل فارغ. إذا كنت تعمل مع مجموعة حقول موجودة، فقم بالتمرير لأسفل لإعداد الحقل.
قم بإعطاء الحقل اسما وقم بتعيين النوع إلى إما
Edm.ComplexTypeأوCollection(Edm.ComplexType).حدد علامات الحذف في أقصى اليسار، ثم حدد إما إضافة حقل أو إضافة حقلفرعي، ثم قم بتعيين السمات.
تحديث الحقول المعقدة
لا تزال كافة قواعد إعادة الفهرسة التي تنطبق على الحقول بشكل عام تنطبق على الحقول المعقدة. إعادة صياغة بعض القواعد الرئيسية هنا، إضافة حقل إلى نوع معقد لا يتطلب إعادة بناء فهرس، ولكن معظم التعديلات تفعل ذلك.
التحديثات الهيكلية للتعريف
يمكنك إضافة حقول فرعية جديدة إلى حقل معقد في أي وقت دون الحاجة إلى إعادة إنشاء فهرس. على سبيل المثال، يسمح بإضافة "الرمز البريدي" إلى أو "وسائل الراحة" إلى، تماما مثل إضافة حقل المستوى الأعلى إلى AddressRooms فهرس. تحتوي المستندات الموجودة على قيمة فارغة للحقول الجديدة حتى تقوم بملء هذه الحقول بشكل صريح عن طريق تحديث بياناتك.
لاحظ أنه ضمن نوع معقد، يحتوي كل حقل فرعي على نوع وقد يحتوي على سمات، تماما كما تفعل حقول المستوى الأعلى
تحديثات البيانات
يعمل تحديث المستندات الموجودة في فهرس باستخدام upload الإجراء بنفس الطريقة مع الحقول المعقدة والبسيطة - يتم استبدال جميع الحقول. ومع ذلك، merge (أو mergeOrUpload عند تطبيقه على مستند موجود) لا يعمل بنفس الطريقة في جميع الحقول. على وجه التحديد ، merge لا يدعم دمج العناصر داخل مجموعة. هذا القيد موجود بالنسبة لمجموعات الأنواع البدائية والمجموعات المعقدة. لتحديث مجموعة، ستحتاج إلى استرداد قيمة المجموعة الكاملة، وإجراء التغييرات، ثم تضمين المجموعة الجديدة في طلب واجهة برمجة تطبيقات الفهرس.
البحث في الحقول المعقدة
تعمل تعبيرات البحث في النماذج الحرة كما هو متوقع مع الأنواع المعقدة. إذا تطابق أي حقل أو حقل فرعي قابل للبحث في أي مكان في مستند، فإن المستند نفسه يكون مطابقا.
تصبح الاستعلامات أكثر دقة عندما يكون لديك مصطلحات وعوامل تشغيل متعددة، وبعض المصطلحات لها أسماء حقول محددة، كما هو ممكن مع بناء جملة Lucene. على سبيل المثال، يحاول هذا الاستعلام مطابقة مصطلحين، "بورتلاند" و "أو"، مقابل حقلين فرعيين من حقل العنوان:
search=Address/City:Portland AND Address/State:OR
الاستعلامات مثل هذه غير مرتبطة بالبحث في النص الكامل ، على عكس الفلاتر. في عوامل التصفية، ترتبط الاستعلامات عبر الحقول الفرعية لمجموعة معقدة باستخدام متغيرات النطاق في any أو all. يعرض استعلام Lucene أعلاه المستندات التي تحتوي على كل من "بورتلاند ، مين" و "بورتلاند ، أوريغون" ، إلى جانب مدن أخرى في ولاية أوريغون. يحدث هذا لأن كل بند ينطبق على جميع قيم حقله في المستند بأكمله، لذلك لا يوجد مفهوم ل "مستند فرعي حالي". لمزيد من المعلومات حول هذا، راجع فهم عوامل تصفية مجموعة OData في البحث المعرفي في Azure.
تحديد حقول معقدة
يتم استخدام المعلمة لاختيار الحقول $select التي يتم إرجاعها في نتائج البحث. لاستخدام هذه المعلمة لتحديد حقول فرعية معينة لحقل معقد، قم بتضمين الحقل الأصل والحقل الفرعي مفصولين بشرطة مائلة (/).
$select=HotelName, Address/City, Rooms/BaseRate
يجب وضع علامة على الحقول على أنها قابلة للاسترداد في الفهرس إذا كنت تريدها في نتائج البحث. يمكن استخدام الحقول التي تم وضع علامة عليها على أنها قابلة للاسترداد فقط في $select البيان.
تصفية الحقول المعقدة ووجهها وفرزها
يمكن أيضا استخدام نفس بناء جملة مسار OData المستخدم للتصفية وعمليات البحث الميدانية للأوجه والفرز وتحديد الحقول في طلب بحث. بالنسبة للأنواع المعقدة، يتم تطبيق القواعد التي تحكم الحقول الفرعية التي يمكن تمييزها على أنها قابلة للفرز أو قابلة للوجه. لمزيد من المعلومات حول هذه القواعد، راجع مرجع إنشاء واجهة برمجة تطبيقات الفهرس.
الحقول الفرعية المواجهة
يمكن وضع علامة على أي حقل فرعي على أنه قابل للوجه ما لم يكن من النوع Edm.GeographyPoint أو Collection(Edm.GeographyPoint).
يتم حساب عدد المستندات التي تم إرجاعها في النتائج الجانبية للمستند الأصلي (فندق)، وليس المستندات الفرعية في مجموعة معقدة (غرف). على سبيل المثال ، لنفترض أن الفندق يحتوي على 20 غرفة من نوع "جناح". بالنظر إلى هذه المعلمة facet=Rooms/Typeالجانبية ، سيكون عدد الأوجه واحدا للفندق ، وليس 20 للغرف.
فرز الحقول المعقدة
تنطبق عمليات الفرز على المستندات (الفنادق) وليس المستندات الفرعية (الغرف). عندما يكون لديك مجموعة من الأنواع المعقدة، مثل الغرف، من المهم أن تدرك أنه لا يمكنك الفرز على الغرف على الإطلاق. في الواقع ، لا يمكنك الفرز على أي مجموعة.
تعمل عمليات الفرز عندما يكون للحقول قيمة واحدة لكل مستند، سواء كان الحقل حقلا بسيطا أو حقلا فرعيا في نوع معقد. على سبيل المثال ، يسمح بأن يكون قابلا للفرز نظرا لوجود عنوان واحد فقط لكل فندق ، Address/City لذلك $orderby=Address/City سيتم فرز الفنادق حسب المدينة.
التصفية في الحقول المعقدة
يمكنك الرجوع إلى الحقول الفرعية لحقل معقد في تعبير عامل تصفية. ما عليك سوى استخدام نفس بناء جملة مسار OData المستخدم في تحديد الحقول وفرزها وتحديدها. على سبيل المثال، سيعرض عامل التصفية التالي جميع الفنادق في كندا:
$filter=Address/Country eq 'Canada'
للتصفية في حقل تجميع معقد، يمكنك استخدام تعبير lambda مع any عوامل التشغيل وعوامل all التشغيل. في هذه الحالة، يكون متغير النطاق لتعبير lambda كائنا يحتوي على حقول فرعية. يمكنك الرجوع إلى تلك الحقول الفرعية باستخدام بناء جملة مسار OData القياسي. على سبيل المثال، سيعرض الفلتر التالي جميع الفنادق التي تحتوي على غرفة ديلوكس واحدة على الأقل وجميع الغرف المخصصة لغير المدخنين:
$filter=Rooms/any(room: room/Type eq 'Deluxe Room') and Rooms/all(room: not room/SmokingAllowed)
كما هو الحال مع الحقول البسيطة ذات المستوى الأعلى، لا يمكن تضمين الحقول الفرعية البسيطة للحقول المعقدة إلا في عوامل التصفية إذا كان لديها السمة القابلة للتصفية التي تم تعيينها في true تعريف الفهرس. لمزيد من المعلومات، راجع مرجع إنشاء واجهة برمجة تطبيقات الفهرس.
الخطوات التالية
جرب مجموعة بيانات الفنادق في معالج استيراد البيانات . ستحتاج إلى معلومات اتصال قاعدة بيانات Cosmos المتوفرة في الملف التمهيدي للوصول إلى البيانات.
مع وجود هذه المعلومات في متناول اليد، تتمثل خطوتك الأولى في المعالج في إنشاء مصدر بيانات Azure Cosmos DB جديد. علاوة على ذلك في المعالج ، عندما تصل إلى صفحة الفهرس المستهدف ، سترى فهرسا بأنواع معقدة. إنشاء هذا الفهرس وتحميله، ثم قم بتنفيذ الاستعلامات لفهم البنية الجديدة.