Operatory logiczne OData w usłudze Azure AI Search — and
, , or
not
Wyrażenia filtru OData w usłudze Azure AI Search to wyrażenia logiczne, które oceniają wartość lub true
false
. Możesz napisać złożony filtr, pisząc serię prostszych filtrów i tworząc je przy użyciu operatorów logicznych z algebry logicznej:
and
: operator binarny, który ocenia,true
czy wyrażenie podrzędne po lewej i prawej stronietrue
daje wartość .or
: operator binarny, który oceniatrue
, czy jedno z jej wyrażeń podrzędnych po lewej lub prawej stronietrue
daje wartość .not
: jednoargumentowy operator, który oceniatrue
, czy jego wyrażenie podrzędnefalse
daje w wyniku wartość , i na odwrót.
Razem z operatorami any
kolekcji i all
umożliwiają konstruowanie filtrów, które mogą wyrażać bardzo złożone kryteria wyszukiwania.
Składnia
Poniższy formularz EBNF (rozszerzony formularz Backus-Naur) definiuje gramatykę wyrażenia OData korzystającego z operatorów logicznych.
logical_expression ::=
boolean_expression ('and' | 'or') boolean_expression
| 'not' boolean_expression
Dostępny jest również interakcyjny diagram składni:
Uwaga
Zobacz dokumentację składni wyrażeń OData dla usługi Azure AI Search , aby zapoznać się z pełną pełną NF.
Istnieją dwie formy wyrażeń logicznych: binarne (and
/or
), gdzie istnieją dwa wyrażenia podrzędne i jednoargumentowe (not
), gdzie istnieje tylko jeden. Wyrażenia podrzędne mogą być wyrażeniami logicznymi dowolnego rodzaju:
- Pola lub zmienne zakresu typu
Edm.Boolean
- Funkcje zwracające wartości typu
Edm.Boolean
, takie jakgeo.intersects
lubsearch.ismatch
- Wyrażenia porównania, takie jak
rating gt 4
- Wyrażenia kolekcji, takie jak
Rooms/any(room: room/Type eq 'Deluxe Room')
- Literały
true
logiczne lubfalse
. - Inne wyrażenia logiczne skonstruowane przy użyciu poleceń
and
,or
inot
.
Ważne
Istnieją sytuacje, w których nie wszystkie rodzaje wyrażenia podrzędnego mogą być używane z wyrażeniami and
/or
lambda, szczególnie wewnątrz wyrażeń lambda. Aby uzyskać szczegółowe informacje, zobacz Operatory kolekcji OData w usłudze Azure AI Search .
Operatory logiczne i null
Większość wyrażeń logicznych, takich jak funkcje i porównania, nie może wygenerować null
wartości, a operatory logiczne nie mogą być stosowane bezpośrednio do null
literału (na przykład x and null
nie jest dozwolone). Jednak pola logiczne mogą mieć null
wartość , więc musisz wiedzieć, jak and
operatory , or
i not
zachowują się w obecności wartości null. Jest to podsumowanie w poniższej tabeli, gdzie b
jest polem typu Edm.Boolean
:
Wyrażenie | Wynik, gdy b jest 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 |
Gdy pole b
logiczne jest wyświetlane samodzielnie w wyrażeniu filtru, zachowuje się tak, jakby zostało zapisane b eq true
, więc jeśli b
ma null
wartość , wyrażenie daje wartość false
. not b
Podobnie zachowuje się tak, jak not (b eq true)
, więc ocenia wartość .true
W ten sposób null
pola zachowują się tak samo jak false
. Jest to zgodne z zachowaniem w połączeniu z innymi wyrażeniami przy użyciu poleceń and
i or
, jak pokazano w powyższej tabeli. Pomimo tego bezpośrednie porównanie z false
(b eq false
) nadal będzie oceniać wartość false
. Innymi słowy, null
nie jest równa false
, mimo że zachowuje się jak w wyrażeniach logicznych.
Przykłady
Dopasuj rating
dokumenty z zakresu od 3 do 5 włącznie:
rating ge 3 and rating le 5
Dopasuj dokumenty, w których wszystkie elementy ratings
pola są mniejsze niż 3 lub większe niż 5:
ratings/all(r: r lt 3 or r gt 5)
Dopasuj location
dokumenty, w których pole znajduje się w danym wielokącie, a dokument nie zawiera terminu "public".
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')
Dopasuj dokumenty dla hoteli w Vancouver, Kanada, gdzie znajduje się pokój typu deluxe z stawką podstawową mniejszą niż 160:
Address/City eq 'Vancouver' and Address/Country eq 'Canada' and Rooms/any(room: room/Type eq 'Deluxe Room' and room/BaseRate lt 160)