Logické operátory OData ve službě Azure AI Search – and
, or
not
Výrazy filtru OData ve službě Azure AI Search jsou logické výrazy, které se vyhodnocují jako true
nebo false
. Složitý filtr můžete napsat tak, že napíšete řadu jednodušších filtrů a vytvoříte je pomocí logických operátorů z logické algebry:
and
: Binární operátor, který se vyhodnocujetrue
, pokud se jeho levý i pravý dílčí výraz vyhodnotí jakotrue
.or
: Binární operátor, který se vyhodnotí jakotrue
jeden z jeho levého nebo pravého dílčího výrazutrue
.not
: Unární operátor, který se vyhodnotítrue
jako dílčí výrazfalse
a naopak.
Ty společně s operátory any
kolekce a all
umožňují vytvořit filtry, které mohou vyjádřit velmi složitá kritéria hledání.
Syntaxe
Následující ebNF (Extended Backus-Naur Form) definuje gramatiku výrazu OData, který používá logické operátory.
logical_expression ::=
boolean_expression ('and' | 'or') boolean_expression
| 'not' boolean_expression
K dispozici je také interaktivní diagram syntaxe:
Poznámka:
Úplný soubor EBNF najdete v referenčních informacích k syntaxi výrazů OData pro Azure AI Search .
Existují dvě formy logických výrazů: binární (and
/or
), kde existují dva dílčí výrazy a unární (not
), kde je jen jeden. Dílčí výrazy můžou být logické výrazy libovolného druhu:
- Pole nebo proměnné rozsahu typu
Edm.Boolean
- Funkce, které vracejí hodnoty typu
Edm.Boolean
, napříkladgeo.intersects
nebosearch.ismatch
- Porovnávací výrazy, například
rating gt 4
- Výrazy kolekce, například
Rooms/any(room: room/Type eq 'Deluxe Room')
- Logické literály
true
nebofalse
. - Jiné logické výrazy vytvořené pomocí
and
,or
anot
.
Důležité
V některých situacích se nedají použít and
/or
všechny druhy dílčích výrazů, zejména uvnitř výrazů lambda. Podrobnosti najdete v tématu Operátory kolekce OData ve službě Azure AI Search .
Logické operátory a null
Většina logických výrazů, jako jsou funkce a porovnání, nemůže vytvořit null
hodnoty a logické operátory nelze použít přímo na null
literál (například x and null
není povoleno). Logická pole však můžou být null
, takže je třeba vědět, jak se and
or
operátory a not
operátory chovají v přítomnosti hodnoty null. Toto je shrnuto v následující tabulce, kde b
je pole typu Edm.Boolean
:
Výraz | Výsledek, pokud b je 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 |
Když se v výrazu filtru zobrazí logické pole b
, chová se, jako by bylo napsané b eq true
, takže pokud b
ano null
, výraz se vyhodnotí jako false
. Podobně se not b
chová jako not (b eq true)
, takže se vyhodnotí jako true
. Tímto způsobem null
se pole chovají stejně jako false
. To je konzistentní s tím, jak se chovají v kombinaci s jinými výrazy používajícími and
a or
, jak je znázorněno v tabulce výše. Navzdory tomu bude i nadále vyhodnoceno false
přímé porovnání s false
hodnotou (b eq false
) . Jinými slovy, null
není rovno false
, i když se chová jako v logických výrazech.
Příklady
Porovná dokumenty, ve kterých je pole v rozsahu rating
3 až 5 včetně:
rating ge 3 and rating le 5
Porovná dokumenty, ve kterých jsou všechny prvky ratings
pole menší než 3 nebo větší než 5:
ratings/all(r: r lt 3 or r gt 5)
Porovná dokumenty, ve kterých location
je pole v daném mnohoúhelníku, a dokument neobsahuje termín "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')
Shodovat dokumenty pro hotely ve Vancouveru, Kanada, kde je pokoj deluxe s základní sazbou nižší než 160:
Address/City eq 'Vancouver' and Address/Country eq 'Canada' and Rooms/any(room: room/Type eq 'Deluxe Room' and room/BaseRate lt 160)