Freigeben über


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 als true ausgewertet wird, wenn sein linker und rechter Unterausdruck als true ausgewertet werden.
  • or: Ein binärer Operator, der als true ausgewertet wird, wenn sein linker oder rechter Unterausdruck als true ausgewertet wird.
  • not: Ein unärer Operator, der als true ausgewertet wird, wenn sein Unterausdruck als false 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 oder search.ismatch
  • Vergleichsausdrücke, z.B. rating gt 4
  • Sammlungsausdrücke, z.B. Rooms/any(room: room/Type eq 'Deluxe Room')
  • Die booleschen Literale true oder false.
  • Andere logische Ausdrücke, die mit and, or oder not 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 bnull 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 bnull 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)

Nächste Schritte