عوامل تشغيل مجموعة OData في البحث المعرفي في Azure - any و all
عند كتابة تعبير عامل تصفية OData لاستخدامه مع Azure Cognitive Search، غالبا ما يكون من المفيد التصفية في حقول المجموعة. يمكنك تحقيق ذلك باستخدام any والمشغلين all .
بناء الجملة
يحدد EBNF (نموذج Backus-Naur الموسعة) التالي قواعد تعبير OData الذي يستخدم any أو all.
collection_filter_expression ::=
field_path'/all(' lambda_expression ')'
| field_path'/any(' lambda_expression ')'
| field_path'/any()'
lambda_expression ::= identifier ':' boolean_expression
يتوفر أيضا رسم تخطيطي تفاعلي لبناء الجملة:
ملاحظة
راجع مرجع بناء جملة تعبير OData للبحث المعرفي Azure للحصول على EBNF الكامل.
هناك ثلاثة أشكال من التعبير تقوم بتصفية المجموعات.
- يتكرر الأولان على حقل مجموعة، ويطبقان مسند معطى في شكل تعبير لامدا على كل عنصر من عناصر المجموعة.
- تعبير يستخدم
allإرجاعtrueإذا كان المسند صحيحا لكل عنصر من عناصر المجموعة. - تعبير يستخدم
anyإرجاعtrueإذا كان المسند صحيحا لعنصر واحد على الأقل من المجموعة.
- تعبير يستخدم
- يستخدم
anyالشكل الثالث من عامل تصفية المجموعة بدون تعبير lambda لاختبار ما إذا كان حقل المجموعة فارغا أم لا. إذا كانت المجموعة تحتوي على أي عناصر ، فإنها ترجعtrue. إذا كانت المجموعة فارغة، فإنها ترجعfalse.
يشبه تعبير lambda في مرشح المجموعة نص حلقة في لغة برمجة. وهو يعرف متغيرا ، يسمى متغير النطاق ، الذي يحمل العنصر الحالي للمجموعة أثناء التكرار. كما أنه يحدد تعبيرا منطقيا آخر هو معايير التصفية التي يجب تطبيقها على متغير النطاق لكل عنصر من عناصر المجموعة.
أمثلة
مطابقة المستندات التي يحتوي حقلها tags على السلسلة "wifi" بالضبط:
tags/any(t: t eq 'wifi')
مطابقة المستندات التي يقع فيها كل عنصر من عناصر الحقل ratings بين 3 و 5 ، بما في ذلك:
ratings/all(r: r ge 3 and r le 5)
مطابقة المستندات التي يكون فيها أي من الإحداثيات الجغرافية في الحقل ضمن المضلع locations المحدد:
locations/any(loc: geo.intersects(loc, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
مطابقة المستندات حيث يكون الحقل rooms فارغا:
not rooms/any()
مطابقة المستندات حيث يحتوي الحقل rooms/amenities على "تلفزيون" لجميع الغرف وأقل rooms/baseRate من 100:
rooms/all(room: room/amenities/any(a: a eq 'tv') and room/baseRate lt 100.0)
التقييدات
لا تتوفر كل ميزة من ميزات تعبيرات المرشح داخل جسم تعبير لامدا. تختلف القيود وفقا لنوع بيانات حقل المجموعة الذي تريد تصفيته. ويلخص الجدول التالي القيود.
| نوع البيانات | الميزات المسموح بها في تعبيرات لامدا مع any |
الميزات المسموح بها في تعبيرات لامدا مع all |
|---|---|---|
Collection(Edm.ComplexType) |
كل شيء باستثناء search.ismatch و search.ismatchscoring |
Same |
Collection(Edm.String) |
مقارنات مع eq أو search.in الجمع بين التعبيرات الفرعية مع or |
مقارنات مع ne أو not search.in() الجمع بين التعبيرات الفرعية مع and |
Collection(Edm.Boolean) |
مقارنات مع eq أو ne |
Same |
Collection(Edm.GeographyPoint) |
استخدام geo.distance مع lt أو le geo.intersects الجمع بين التعبيرات الفرعية مع or |
استخدام geo.distance مع gt أو ge not geo.intersects(...) الجمع بين التعبيرات الفرعية مع and |
Collection(Edm.DateTimeOffset), Collection(Edm.Double), Collection(Edm.Int32), Collection(Edm.Int64) |
المقارنات باستخدام eq، ، ، ، ، le، ltnegtأوge الجمع بين المقارنات مع التعبيرات الفرعية الأخرى باستخدام or الجمع بين المقارنات باستثناء ne التعبيرات الفرعية الأخرى باستخدام and التعبيرات التي تستخدم مجموعات من andالنموذج العادي المنفصل (DNF) وفي or |
المقارنات باستخدام eq، ، ، ، ، le، ltnegtأوge الجمع بين المقارنات مع التعبيرات الفرعية الأخرى باستخدام and الجمع بين المقارنات باستثناء eq التعبيرات الفرعية الأخرى باستخدام or التعبيرات التي تستخدم مجموعات من and و or في شكل عادي مقترن (CNF) |
لمزيد من التفاصيل حول هذه القيود بالإضافة إلى أمثلة، راجع استكشاف أخطاء عوامل تصفية المجموعات وإصلاحها في Azure Cognitive Search. لمزيد من المعلومات المتعمقة حول سبب وجود هذه القيود، راجع فهم عوامل تصفية المجموعات في Azure Cognitive Search.