عوامل تشغيل مجموعة 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

يتوفر أيضا رسم تخطيطي تفاعلي لبناء الجملة:

هناك ثلاثة أشكال من التعبير تقوم بتصفية المجموعات.

  • يتكرر الأولان على حقل مجموعة، ويطبقان مسند معطى في شكل تعبير لامدا على كل عنصر من عناصر المجموعة.
    • تعبير يستخدم 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.

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