OData $filter بناء الجملة في Azure Cognitive Search
يستخدم Azure Cognitive Search تعبيرات عامل تصفية OData لتطبيق معايير إضافية على استعلام بحث إلى جانب مصطلحات البحث في النص الكامل. توضح هذه المقالة بناء جملة عوامل التصفية بالتفصيل. لمزيد من المعلومات العامة حول عوامل التصفية وكيفية استخدامها لتحقيق سيناريوهات استعلام محددة، راجع عوامل التصفية في البحث المعرفي في Azure.
بناء الجملة
المرشح في لغة OData هو تعبير منطقي ، والذي بدوره يمكن أن يكون واحدا من عدة أنواع من التعبير ، كما هو موضح في EBNF التالي (نموذج Backus-Naur الموسع):
boolean_expression ::=
collection_filter_expression
| logical_expression
| comparison_expression
| boolean_literal
| boolean_function_call
| '(' boolean_expression ')'
| variable
/* This can be a range variable in the case of a lambda, or a field path. */
variable ::= identifier | field_path
يتوفر أيضا رسم تخطيطي تفاعلي لبناء الجملة:
ملاحظة
راجع مرجع بناء جملة تعبير OData للبحث المعرفي Azure للحصول على EBNF الكامل.
تشمل أنواع التعبيرات المنطقية ما يلي:
- تجميع تعبيرات التصفية باستخدام
anyأوall. تطبق هذه معايير التصفية على حقول التجميع. لمزيد من المعلومات، راجع عوامل تشغيل مجموعة OData في البحث المعرفي في Azure. - التعبيرات المنطقية التي تجمع بين التعبيرات المنطقية الأخرى باستخدام عوامل التشغيل
and،orوnot. لمزيد من المعلومات، راجع عوامل التشغيل المنطقية OData في البحث المعرفي في Azure. - تعبيرات المقارنة، التي تقارن الحقول أو متغيرات النطاق بقيم ثابتة باستخدام عوامل التشغيل
eqو ، ، ، ،gegtltو .neleلمزيد من المعلومات، راجع عوامل تشغيل مقارنة OData في البحث المعرفي في Azure. تستخدم تعبيرات المقارنة أيضا لمقارنة المسافات بين الإحداثيات الجغرافية المكانية باستخدام الدالةgeo.distance. لمزيد من المعلومات، راجع الدالات الجغرافية المكانية OData في البحث المعرفي في Azure. - الحروف
trueالمنطقية وfalse. يمكن أن تكون هذه الثوابت مفيدة في بعض الأحيان عند إنشاء مرشحات برمجيا ، ولكن بخلاف ذلك لا تميل إلى استخدامها في الممارسة العملية. - المكالمات إلى الوظائف المنطقية، بما في ذلك:
geo.intersects، الذي يختبر ما إذا كانت نقطة معينة ضمن مضلع معين. لمزيد من المعلومات، راجع الدالات الجغرافية المكانية OData في البحث المعرفي في Azure.search.in، الذي يقارن بين حقل أو متغير نطاق مع كل قيمة في قائمة قيم. لمزيد من المعلومات، راجع الدالة ODatasearch.inفي البحث المعرفي في Azure.search.ismatchوsearch.ismatchscoring، التي تنفذ عمليات البحث عن النص الكامل في سياق عامل تصفية. لمزيد من المعلومات، راجع وظائف البحث عن النص الكامل OData في البحث المعرفي في Azure.
- مسارات الحقل أو متغيرات النطاق من النوع
Edm.Boolean. على سبيل المثال، إذا كان الفهرس الخاص بك يحتوي على حقل منطقي يسمىIsEnabledوتريد إرجاع جميع المستندات حيث يوجد هذا الحقل، يمكن أن يكون تعبير عامل التصفية الخاص بك هوtrueالاسمIsEnabledفقط. - التعبيرات المنطقية بين قوسين. يمكن أن يساعد استخدام الأقواس في تحديد ترتيب العمليات في عامل تصفية بشكل صريح. لمزيد من المعلومات حول الأسبقية الافتراضية لمشغلي OData، راجع القسم التالي.
أسبقية المشغل في الفلاتر
إذا كتبت تعبير عامل تصفية بدون أقواس حول تعبيراته الفرعية، فسيقوم Azure Cognitive Search بتقييمه وفقا لمجموعة من قواعد أسبقية عوامل التشغيل. تستند هذه القواعد إلى عوامل التشغيل المستخدمة لدمج التعبيرات الفرعية. يسرد الجدول التالي مجموعات عوامل التشغيل بالترتيب من أعلى إلى أدنى أسبقية :
| المجموعة | المشغل (المشغلون) |
|---|---|
| العوامل المنطقية | not |
| عوامل المقارنة | eq, ne, gt, lt, ge, le |
| العوامل المنطقية | and |
| العوامل المنطقية | or |
المشغل الأعلى في الجدول أعلاه سوف "يرتبط بشكل أكثر إحكاما" بعملياته أكثر من المشغلين الآخرين. على سبيل المثال ، له أسبقية أعلى من ، وعوامل المقارنة ذات أسبقية أعلى من orأي منهما ، and وبالتالي فإن التعبيرين التاليين متساويان:
Rating gt 0 and Rating lt 3 or Rating gt 7 and Rating lt 10
((Rating gt 0) and (Rating lt 3)) or ((Rating gt 7) and (Rating lt 10))
يتمتع not المشغل بأعلى أسبقية على الإطلاق - حتى أعلى من مشغلي المقارنة. لهذا السبب إذا حاولت كتابة فلتر مثل هذا:
not Rating gt 5
ستتلقى رسالة الخطأ هذه:
Invalid expression: A unary operator with an incompatible type was detected. Found operand type 'Edm.Int32' for operator kind 'Not'.
يحدث هذا الخطأ لأن المشغل مرتبط بالحقل فقط Rating ، وهو من النوع Edm.Int32، وليس بتعبير المقارنة بأكمله. الإصلاح هو وضع معامل not بين قوسين:
not (Rating gt 5)
قيود حجم الفلتر
هناك حدود لحجم تعبيرات عامل التصفية وتعقيدها التي يمكنك إرسالها إلى Azure Cognitive Search. تستند الحدود تقريبا إلى عدد العبارات في تعبير الفلتر. المبدأ التوجيهي الجيد هو أنه إذا كان لديك مئات البنود ، فأنت معرض لخطر تجاوز الحد. نوصي بتصميم تطبيقك بطريقة لا تنشئ فلاتر ذات حجم غير محدود.
تلميح
يمكن أن يساعد استخدام الدالة بدلا من الانفصالات الطويلة لمقارنات المساواة في تجنب حد عبارة التصفيةsearch.in، نظرا لأن استدعاء الدالة يحتسب كجملة واحدة.
أمثلة
ابحث عن جميع الفنادق التي تحتوي على غرفة واحدة على الأقل بسعر أساسي أقل من 200 دولار أمريكي والتي تم تقييمها عند 4 أو أكثر:
$filter=Rooms/any(room: room/BaseRate lt 200.0) and Rating ge 4
ابحث عن جميع الفنادق بخلاف "Sea View Motel" التي تم تجديدها منذ عام 2010:
$filter=HotelName ne 'Sea View Motel' and LastRenovationDate ge 2010-01-01T00:00:00Z
ابحث عن جميع الفنادق التي تم تجديدها في عام 2010 أو أحدث. يتضمن التاريخ والوقت الحرفي معلومات المنطقة الزمنية لتوقيت المحيط الهادئ الرسمي:
$filter=LastRenovationDate ge 2010-01-01T00:00:00-08:00
ابحث عن جميع الفنادق التي بها مواقف سيارات مشمولة وحيث جميع الغرف مخصصة لغير المدخنين:
$filter=ParkingIncluded and Rooms/all(room: not room/SmokingAllowed)
- أو -
$filter=ParkingIncluded eq true and Rooms/all(room: room/SmokingAllowed eq false)
ابحث عن جميع الفنادق الفاخرة أو تشمل مواقف سيارات ولديها تصنيف 5:
$filter=(Category eq 'Luxury' or ParkingIncluded eq true) and Rating eq 5
ابحث عن جميع الفنادق التي تحمل علامة "wifi" في غرفة واحدة على الأقل (حيث تحتوي كل غرفة على علامات مخزنة في حقل Collection(Edm.String) ):
$filter=Rooms/any(room: room/Tags/any(tag: tag eq 'wifi'))
ابحث عن جميع الفنادق التي بها أي غرفة:
$filter=Rooms/any()
ابحث عن جميع الفنادق التي لا تحتوي على غرف:
$filter=not Rooms/any()
ابحث عن جميع الفنادق على بعد 10 كيلومترات من نقطة مرجعية معينة (أين Location يوجد حقل من النوع Edm.GeographyPoint):
$filter=geo.distance(Location, geography'POINT(-122.131577 47.678581)') le 10
ابحث عن جميع الفنادق ضمن إطار عرض معين موصوف بأنه مضلع (حيث Location يوجد حقل من النوع Edm.GeographyPoint). يجب إغلاق المضلع ، مما يعني أن مجموعتي النقطة الأولى والأخيرة يجب أن تكونا متماثلتين. أيضا ، يجب سرد النقاط بترتيب عكس اتجاه عقارب الساعة.
$filter=geo.intersects(Location, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))')
ابحث عن جميع الفنادق التي يكون فيها حقل "الوصف" فارغا. سيكون الحقل فارغا إذا لم يتم تعيينه مطلقا، أو إذا تم تعيينه صراحة إلى فارغ:
$filter=Description eq null
ابحث عن جميع الفنادق التي تحمل اسما مساويا ل "موتيل مطل على البحر" أو "فندق اقتصادي"). تحتوي هذه العبارات على مسافات، والمسافة هي محدد افتراضي. يمكنك تحديد محدد بديل في علامات اقتباس مفردة كمعلمة السلسلة الثالثة:
$filter=search.in(HotelName, 'Sea View motel,Budget hotel', ',')
ابحث عن جميع الفنادق التي يساوي اسمها إما "موتيل مطل على البحر" أو "فندق اقتصادي" مفصولة ب "|"):
$filter=search.in(HotelName, 'Sea View motel|Budget hotel', '|')
ابحث عن جميع الفنادق التي تحمل جميع الغرف علامة "wifi" أو "tub":
$filter=Rooms/any(room: room/Tags/any(tag: search.in(tag, 'wifi, tub')))
ابحث عن تطابق في العبارات داخل المجموعة، مثل "رفوف المناشف الساخنة" أو "مجفف الشعر المضمن" في العلامات.
$filter=Rooms/any(room: room/Tags/any(tag: search.in(tag, 'heated towel racks,hairdryer included', ','))
ابحث عن المستندات التي تحتوي على كلمة "الواجهة البحرية". استعلام الفلتر هذا مطابق لطلب بحث يحتوي search=waterfrontعلى .
$filter=search.ismatchscoring('waterfront')
ابحث عن المستندات التي تحتوي على كلمة "نزل" وتصنيف أكبر أو يساوي 4 ، أو المستندات التي تحتوي على كلمة "موتيل" وتصنيف يساوي 5. لا يمكن التعبير عن هذا الطلب بدون search.ismatchscoring الوظيفة لأنه يجمع بين البحث عن النص الكامل وعمليات التصفية باستخدام or.
$filter=search.ismatchscoring('hostel') and rating ge 4 or search.ismatchscoring('motel') and rating eq 5
ابحث عن المستندات بدون كلمة "رفاهية".
$filter=not search.ismatch('luxury')
ابحث عن المستندات التي تحتوي على عبارة "عرض المحيط" أو تصنيف يساوي 5. سيتم تنفيذ الاستعلام فقط مقابل الحقول search.ismatchscoringHotelName و Description. سيتم إرجاع المستندات التي تطابق فقط البند الثاني من الانفصال أيضا - الفنادق التي Rating تساوي 5. سيتم إرجاع هذه المستندات بدرجة تساوي صفر لتوضيح أنها لم تتطابق مع أي من الأجزاء المسجلة في التعبير.
$filter=search.ismatchscoring('"ocean view"', 'Description,HotelName') or Rating eq 5
ابحث عن الفنادق التي لا يفصل بين مصطلحي "الفندق" و "المطار" أكثر من خمس كلمات في الوصف ، وحيث تكون جميع الغرف لغير المدخنين. يستخدم هذا الاستعلام لغة استعلام Lucene الكاملة.
$filter=search.ismatch('"hotel airport"~5', 'Description', 'full', 'any') and not Rooms/any(room: room/SmokingAllowed)
ابحث عن المستندات التي تحتوي على كلمة تبدأ بالأحرف "lux" في حقل الوصف. يستخدم هذا الاستعلام البحث عن البادئة مع search.ismatch.
$filter=search.ismatch('lux*', 'Description')