Logische OData-Operatoren in Azure KI Search: and
, or
, not
OData-Filterausdrücke in Azure KI Search sind boolesche Ausdrücke, die in true
oder false
ausgewertet werden. Sie können einen komplexen Filter schreiben, indem Sie eine Reihe von einfacheren Filtern erstellen und diese dann mit den logischen Operatoren aus boolescher Algebra zusammensetzen:
and
: Ein binärer Operator, der alstrue
ausgewertet wird, wenn sein linker und rechter Unterausdruck alstrue
ausgewertet werden.or
: Ein binärer Operator, der alstrue
ausgewertet wird, wenn sein linker oder rechter Unterausdruck alstrue
ausgewertet wird.not
: Ein unärer Operator, der alstrue
ausgewertet wird, wenn sein Unterausdruck alsfalse
ausgewertet wird, und umgekehrt.
Diese Operatoren ermöglichen es Ihnen zusammen mit den Sammlungsoperatorenany
und all
, Filter zu erstellen, die sehr komplexe Suchkriterien ausdrücken können.
Syntax
Die folgende EBNF (Erweiterte Backus-Naur-Form) definiert die Grammatik eines OData-Ausdrucks, der die logischen Operatoren verwendet.
logical_expression ::=
boolean_expression ('and' | 'or') boolean_expression
| 'not' boolean_expression
Ein interaktives Syntaxdiagramm ist ebenfalls verfügbar:
Hinweis
Die vollständige EBNF finden Sie in der Referenz zur OData-Ausdruckssyntax für Azure KI Search.
Es gibt zwei Formen von logischen Ausdrücken: binär (and
/or
) mit zwei Unterausdrücken und unär (not
) mit nur einem Unterausdruck. Die Unterausdrücke können beliebige boolesche Ausdrücke sein:
- Felder oder Bereichsvariablen vom Typ
Edm.Boolean
- Funktionen, die Werte vom Typ
Edm.Boolean
zurückgeben, z.B.geo.intersects
odersearch.ismatch
- Vergleichsausdrücke, z.B.
rating gt 4
- Sammlungsausdrücke, z.B.
Rooms/any(room: room/Type eq 'Deluxe Room')
- Die booleschen Literale
true
oderfalse
. - Andere logische Ausdrücke, die mit
and
,or
odernot
gebildet werden.
Wichtig
Unter bestimmten Umständen können nicht alle Arten von Unterausdrücken mit and
/or
verwendet werden, insbesondere innerhalb von Lambdaausdrücken. Details dazu finden Sie unter OData-Sammlungsoperatoren in Azure KI Search.
Logische Operatoren und null
Die meisten booleschen Ausdrücke wie Funktionen und Vergleiche können keine null
-Werte erzeugen, und die logischen Operatoren können nicht direkt auf das null
-Literal angewendet werden (z.B. ist x and null
unzulässig). Boolesche Felder können jedoch null
sein, sodass Sie beachten müssen, wie sich die Operatoren and
, or
und not
bei Vorhandensein von null verhalten. Dies wird in der folgenden Tabelle zusammengefasst, wobei b
ein Feld vom Typ Edm.Boolean
ist:
Ausdruck | Ergebnis, wenn b null ist |
---|---|
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 |
Wenn ein boolesches Feld b
von selbst in einem Filterausdruck vorkommt, verhält es sich, als wäre es b eq true
. Wenn also b
null
ist, wird der Ausdruck in false
ausgewertet. Auf ähnliche Weise verhält sich not b
wie not (b eq true)
und wird daher in true
ausgewertet. Auf diese Weise verhalten sich null
-Felder wie false
. Dies entspricht dem Verhalten bei der Kombination mit anderen Ausdrücken unter Verwendung von and
und or
, wie in der Tabelle oben gezeigt. Dennoch wird ein direkter Vergleich mit false
(b eq false
) immer noch in false
ausgewertet. Mit anderen Worten: null
ist nicht gleich false
, auch wenn es sich in booleschen Ausdrücken so verhält.
Beispiele
Abgleichen von Dokumenten, bei denen das rating
-Feld zwischen 3 und 5 (einschließlich) liegt:
rating ge 3 and rating le 5
Abgleichen von Dokumenten, bei denen alle Elemente des ratings
-Felds kleiner als 3 oder größer als 5 sind:
ratings/all(r: r lt 3 or r gt 5)
Abgleichen von Dokumenten, bei denen das location
-Feld im angegebenen Polygon liegt und das Dokument nicht den Begriff „public“ (öffentlich) enthält.
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')
Abgleichen von Dokumenten für Hotels in Vancouver (Kanada), die ein Luxuszimmer mit einem Basispreis kleiner als 160 bieten:
Address/City eq 'Vancouver' and Address/Country eq 'Canada' and Rooms/any(room: room/Type eq 'Deluxe Room' and room/BaseRate lt 160)