Logiska OData-operatorer i Azure AI Search – and
, or
, not
OData-filteruttryck i Azure AI Search är booleska uttryck som utvärderas till true
eller false
. Du kan skriva ett komplext filter genom att skriva en serie enklare filter och skapa dem med hjälp av logiska operatorer från boolesk algebra:
and
: En binär operator som utvärderas tilltrue
om både dess underuttryck till vänster och höger utvärderas tilltrue
.or
: En binär operator som utvärderas tilltrue
om något av dess underuttryck till vänster eller höger utvärderas tilltrue
.not
: En unary-operator som utvärderas tilltrue
om dess underuttryck utvärderas tillfalse
, och vice versa.
Med dessa, tillsammans med samlingsoperatorerna any
och all
, kan du skapa filter som kan uttrycka mycket komplexa sökvillkor.
Syntax
Följande EBNF (Extended Backus-Naur Form) definierar grammatiken för ett OData-uttryck som använder de logiska operatorerna.
logical_expression ::=
boolean_expression ('and' | 'or') boolean_expression
| 'not' boolean_expression
Ett interaktivt syntaxdiagram är också tillgängligt:
Kommentar
Se syntaxreferens för OData-uttryck för Azure AI Search för hela EBNF.
Det finns två former av logiska uttryck: binärt (and
/or
), där det finns två underuttryck och unary (not
), där det bara finns ett. Underuttrycken kan vara booleska uttryck av alla slag:
- Fält eller intervallvariabler av typen
Edm.Boolean
- Funktioner som returnerar värden av typen
Edm.Boolean
, till exempelgeo.intersects
ellersearch.ismatch
- Jämförelseuttryck, till exempel
rating gt 4
- Samlingsuttryck, till exempel
Rooms/any(room: room/Type eq 'Deluxe Room')
- Booleska literaler
true
ellerfalse
. - Andra logiska uttryck som konstruerats med hjälp av
and
,or
ochnot
.
Viktigt!
Det finns vissa situationer där inte alla typer av underuttryck kan användas med and
/or
, särskilt i lambda-uttryck. Mer information finns i OData-insamlingsoperatorer i Azure AI Search .
Logiska operatorer och null
De flesta booleska uttryck som funktioner och jämförelser kan inte generera null
värden, och de logiska operatorerna kan inte tillämpas direkt på literalen null
(till exempel x and null
tillåts inte). Booleska fält kan dock vara null
, så du måste vara medveten om hur operatorerna and
, or
och not
beter sig i närvaro av null. Detta sammanfattas i följande tabell, där b
är ett fält av typen Edm.Boolean
:
Uttryck | Resultat när b är 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 |
När ett booleskt fält b
visas självt i ett filteruttryck beter det sig som om det hade skrivits b eq true
, så om b
är null
utvärderas uttrycket till false
. not b
På samma sätt fungerar det som not (b eq true)
, så det utvärderas till true
. På så sätt null
beter sig fälten på samma sätt som false
. Detta stämmer överens med hur de fungerar när de kombineras med andra uttryck med hjälp av and
och or
, enligt tabellen ovan. Trots detta utvärderas fortfarande en direkt jämförelse med false
(b eq false
) till false
. Är med andra ord null
inte lika med false
, även om det beter sig som det i booleska uttryck.
Exempel
Matcha dokument där fältet rating
är mellan 3 och 5, inklusive:
rating ge 3 and rating le 5
Matcha dokument där alla element i ratings
fältet är mindre än 3 eller större än 5:
ratings/all(r: r lt 3 or r gt 5)
Matcha dokument där fältet location
finns inom den angivna polygonen och dokumentet innehåller inte termen "offentlig".
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')
Matcha dokument för hotell i Vancouver, Kanada där det finns ett deluxe rum med ett baspris mindre än 160:
Address/City eq 'Vancouver' and Address/Country eq 'Canada' and Rooms/any(room: room/Type eq 'Deluxe Room' and room/BaseRate lt 160)