Operator logis OData di Azure AI Search - and
, , or
not
Ekspresi filter OData di Azure AI Search adalah ekspresi Boolean yang mengevaluasi ke true
atau false
. Anda dapat menulis filter yang kompleks dengan menulis serangkaian filter yang lebih sederhana dan menyusunnya menggunakan operator logis dari aljabar Boolean:
and
: Operator biner yang mengevaluasi ketrue
jika sub-ekspresi kiri dan kanannya mengevaluasi ketrue
.or
: Operator biner yang mengevaluasi ketrue
jika salah satu sub-ekspresi kiri atau kanannya mengevaluasi ketrue
.not
: Operator uner yang mengevaluasi ketrue
jika sub-ekspresinya mengevaluasi kefalse
, dan sebaliknya.
Ini, bersama dengan operator koleksi any
dan all
, memungkinkan Anda untuk membangun filter yang dapat mengekspresikan kriteria pencarian yang sangat kompleks.
Sintaks
EBNF (Extended Backus-Naur Form) berikut mendefinisikan tata bahasa ekspresi OData yang menggunakan operator logis.
logical_expression ::=
boolean_expression ('and' | 'or') boolean_expression
| 'not' boolean_expression
Diagram sintaksis interaktif juga tersedia:
Catatan
Lihat Referensi sintaks ekspresi OData untuk Pencarian Azure AI untuk EBNF lengkap.
Ada dua bentuk ekspresi logis: biner (and
/or
), di mana ada dua sub-ekspresi, dan uner (not
), di mana hanya ada satu. Sub-ekspresi dapat menjadi ekspresi Boolean jenis apa pun:
- Variabel bidang atau rentang tipe
Edm.Boolean
- Fungsi yang mengembalikan nilai tipe
Edm.Boolean
, sepertigeo.intersects
atausearch.ismatch
- Ekspresi perbandingan, seperti
rating gt 4
- Ekspresi koleksi, seperti
Rooms/any(room: room/Type eq 'Deluxe Room')
- Harfiah Boolean
true
ataufalse
. - Ekspresi logis lain yang dibangun menggunakan
and
,or
, dannot
.
Penting
Ada beberapa situasi di mana tidak semua jenis sub-ekspresi dapat digunakan dengan and
/or
, terutama di dalam ekspresi lambda. Lihat Operator pengumpulan OData di Pencarian Azure AI untuk detailnya.
Operator logis dan null
Sebagian besar ekspresi Boolean seperti fungsi dan perbandingan tidak dapat menghasilkan null
nilai, dan operator logis tidak dapat diterapkan ke null
harfiah secara langsung (misalnya, x and null
tidak dibolehkan). Namun, bidang Boolean bisa berupa null
, jadi Anda perlu menyadari bagaimana operator and
, or
dan not
berperilaku di hadapan null. Ini diringkas dalam tabel berikut, di mana b
merupakan bidang tipe Edm.Boolean
:
Ekspresi | Hasil ketika b adalah null |
---|---|
b |
false |
not b |
true |
b eq true |
false |
b eq false |
false |
b eq null |
true |
b ne true |
true |
b ne false |
true |
b ne null |
false |
b and true |
false |
b and false |
false |
b or true |
true |
b or false |
false |
Ketika bidang Boolean b
muncul dengan sendirinya dalam ekspresi filter, itu berperilaku seolah-olah telah ditulis b eq true
, jadi jika b
adalah null
, ekspresi mengevaluasi ke false
. Demikian pula, not b
berperilaku seperti not (b eq true)
, sehingga mengevaluasi ke true
. Dengan cara ini, null
bidang berperilaku sama seperti false
. Hal ini konsisten dengan bagaimana mereka berperilaku ketika dikombinasikan dengan ekspresi lain menggunakan and
dan or
, seperti yang ditunjukkan pada tabel di atas. Meskipun demikian, perbandingan langsung dengan false
(b eq false
) masih akan mengevaluasi ke false
. Dengan kata lain, null
tidak sama dengan false
, meskipun berperilaku seperti itu dalam ekspresi Boolean.
Contoh
Cocokkan dokumen di mana rating
bidang berada antara 3 dan 5, termasuk:
rating ge 3 and rating le 5
Cocokkan dokumen di mana semua elemen ratings
bidang kurang dari 3 atau lebih besar dari 5:
ratings/all(r: r lt 3 or r gt 5)
Cocokkan dokumen di mana location
bidang berada dalam poligon yang diberikan, dan dokumen tidak berisi istilah "publik".
geo.intersects(location, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))') and not search.ismatch('public')
Cocokkan dokumen untuk hotel di Vancouver, Kanada di mana ada kamar deluxe dengan tarif dasar kurang dari 160:
Address/City eq 'Vancouver' and Address/Country eq 'Canada' and Rooms/any(room: room/Type eq 'Deluxe Room' and room/BaseRate lt 160)