OData-Vergleichsoperatoren in Azure KI Search: eq
, ne
, gt
, lt
, ge
und le
Der grundlegendste Vorgang in einem OData-Filterausdruck in Azure KI Search ist der Vergleich eines Felds mit einem bestimmten Wert. Es sind zwei Arten von Vergleich möglich: Gleichheitsvergleich und Bereichsvergleich. Sie können die folgenden Operatoren verwenden, um ein Feld mit einem konstanten Wert zu vergleichen:
Gleichheitsoperatoren:
eq
: Testet, ob ein Feld gleich einem konstanten Wert ist.ne
: Testet, ob ein Feld ungleich einem konstanten Wert ist.
Bereichsoperatoren:
gt
: Testet, ob ein Feld größer als ein konstanter Wert ist.lt
: Testet, ob ein Feld kleiner als ein konstanter Wert ist.ge
: Testet, ob ein Feld größer oder gleich einem konstanten Wert ist.le
: Testet, ob ein Feld kleiner oder gleich einem konstanten Wert ist.
Sie können die Bereichsoperatoren in Kombination mit den logischen Operatoren verwenden, um zu testen, ob ein Feld innerhalb eines bestimmten Wertebereichs liegt. Beispiele dazu finden Sie in den Abschnitten weiter unten in diesem Artikel.
Hinweis
Wenn Sie dies vorziehen, können Sie den konstanten Wert auf der linken Seite des Operators und den Feldnamen auf der rechten Seite platzieren. Bei Bereichsoperatoren wird die Bedeutung des Vergleichs umgekehrt. Wenn sich der konstante Wert beispielsweise auf der linken Seite befindet, würde gt
überprüfen, ob der konstante Wert größer als das Feld ist. Sie können die Vergleichsoperatoren auch verwenden, um das Ergebnis einer Funktion (beispielsweise geo.distance
) mit einem Wert zu vergleichen. Für boolesche Funktionen wie search.ismatch
ist der Vergleich des Ergebnisses mit true
oder false
optional.
Syntax
Die folgende EBNF (Erweiterte Backus-Naur-Form) definiert die Grammatik eines OData-Ausdrucks, der die Vergleichsoperatoren verwendet.
comparison_expression ::=
variable_or_function comparison_operator constant |
constant comparison_operator variable_or_function
variable_or_function ::= variable | function_call
comparison_operator ::= 'gt' | 'lt' | 'ge' | 'le' | 'eq' | 'ne'
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 Vergleichsausdrücken. Der einzige Unterschied zwischen ihnen besteht darin, ob die Konstante auf der linken oder rechten Seite des Operators platziert wird. Der Ausdruck auf der anderen Seite des Operators muss eine Variable oder ein Funktionsaufruf sein. Eine Variable kann entweder ein Feldname oder eine Bereichsvariable im Fall eines Lambdaausdrucks sein.
Datentypen für Vergleiche
Die Datentypen auf beiden Seiten eines Vergleichsoperators müssen kompatibel sein. Wenn die linke Seite beispielsweise ein Feld vom Typ Edm.DateTimeOffset
ist, dann muss die rechte Seite eine Datum/Uhrzeit-Konstante sein. Numerische Datentypen sind flexibler. Sie können Variablen und Funktionen eines beliebigen numerischen Typs mit Konstanten eines beliebigen anderen numerischen Typs vergleichen. Dabei gelten wenige Einschränkungen, die in der folgenden Tabelle beschrieben werden.
Variable oder Funktionstyp | Typ des konstanten Werts | Begrenzungen |
---|---|---|
Edm.Double |
Edm.Double |
Vergleich unterliegt besonderen Regeln für NaN |
Edm.Double |
Edm.Int64 |
Konstante wird in Edm.Double konvertiert, was zu einem Genauigkeitsverlust bei großen Werten führt |
Edm.Double |
Edm.Int32 |
– |
Edm.Int64 |
Edm.Double |
Vergleiche mit NaN , -INF oder INF sind unzulässig |
Edm.Int64 |
Edm.Int64 |
– |
Edm.Int64 |
Edm.Int32 |
Konstante wird vor dem Vergleich in Edm.Int64 konvertiert |
Edm.Int32 |
Edm.Double |
Vergleiche mit NaN , -INF oder INF sind unzulässig |
Edm.Int32 |
Edm.Int64 |
– |
Edm.Int32 |
Edm.Int32 |
– |
Für Vergleiche, die unzulässig sind (z. B. Vergleich eines Felds vom Typ Edm.Int64
mit NaN
), gibt die REST-API von Azure KI Search die Fehlermeldung „HTTP 400: Ungültige Anforderung“ zurück.
Wichtig
Auch wenn numerische Typvergleiche flexibel sind, wird dringend empfohlen, Vergleiche in Filtern zu schreiben, sodass der konstante Wert vom gleichen Datentyp ist wie die Variable oder Funktion, mit der er verglichen wird. Dies ist besonders wichtig beim Mischen von Gleitkomma- und Integerwerten, bei denen implizite Konvertierungen möglich sind, die zu einem Genauigkeitsverlust führen.
Sonderfälle für null
und NaN
Bei der Verwendung von Vergleichsoperatoren ist es wichtig, sich daran zu erinnern, dass alle Nicht-Sammlungsfelder in Azure KI Search potenziell null
sein können. Die folgende Tabelle zeigt alle möglichen Ergebnisse für einen Vergleichsausdruck, bei dem jede Seite null
sein kann:
Operator | Ergebnis, wenn nur das Feld oder die Variable null ist |
Ergebnis, wenn nur die Konstante null ist |
Ergebnis, wenn sowohl das Feld oder die Variable als auch die Konstante null sind |
---|---|---|---|
gt |
false |
HTTP 400: Ungültige Anforderung | HTTP 400: Ungültige Anforderung |
lt |
false |
HTTP 400: Ungültige Anforderung | HTTP 400: Ungültige Anforderung |
ge |
false |
HTTP 400: Ungültige Anforderung | HTTP 400: Ungültige Anforderung |
le |
false |
HTTP 400: Ungültige Anforderung | HTTP 400: Ungültige Anforderung |
eq |
false |
false |
true |
ne |
true |
true |
false |
Zusammenfassend lässt sich sagen, dass null
nur mit sich selbst gleich ist und nicht kleiner oder größer als jeder andere Wert ist.
Wenn Ihr Index Felder vom Typ Edm.Double
aufweist und Sie NaN
-Werte in diese Felder hochladen, müssen Sie dies beim Schreiben von Filtern berücksichtigen. Azure KI Search implementiert den IEEE 754-Standard für die Verarbeitung von NaN
-Werten, und Vergleiche mit solchen Werten führen zu nicht eindeutigen Ergebnissen, wie in der folgenden Tabelle gezeigt.
Operator | Ergebnis, wenn mindestens einer der Operanden NaN ist |
---|---|
gt |
false |
lt |
false |
ge |
false |
le |
false |
eq |
false |
ne |
true |
Zusammenfassend lässt sich sagen, dass NaN
mit keinem Wert gleich ist, auch nicht mit sich selbst.
Vergleichen von räumlichen Daten
Sie können ein Feld vom Typ Edm.GeographyPoint
nicht direkt mit einem konstanten Wert vergleichen, aber Sie können die geo.distance
-Funktion verwenden. Diese Funktion gibt einen Wert vom Typ Edm.Double
zurück, sodass Sie ihn mit einer numerischen Konstante vergleichen können, die basierend auf dem Abstand von konstanten räumlichen Koordinaten gefiltert werden soll. Weitere Informationen finden Sie in den folgenden Beispielen.
Vergleichen von Zeichenfolgendaten
Zeichenfolgen können in Filtern mit den Operatoren eq
und ne
verglichen werden, um genaue Übereinstimmungen zu ermitteln. Bei diesen Vergleichen wird die Groß-/Kleinschreibung beachtet.
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 das Location
-Feld weniger als 2 Kilometer vom angegebenen Breitengrad und Längengrad entfernt ist:
geo.distance(Location, geography'POINT(-122.031577 47.578581)') lt 2.0
Abgleichen von Dokumenten, bei denen das Feld LastRenovationDate
größer oder gleich dem 1. Januar 2015, 24 Uhr UTC ist:
LastRenovationDate ge 2015-01-01T00:00:00.000Z
Abgleichen von Dokumenten, bei denen das Details/Sku
-Feld nicht null
ist:
Details/Sku ne null
Abgleichen von Dokumenten für Hotels, in denen mindestens ein Raum den Typ „Deluxe Room“ (Luxuszimmer) aufweist, wobei die Zeichenfolge des Rooms/Type
-Felds genau mit dem Filter übereinstimmt:
Rooms/any(room: room/Type eq 'Deluxe Room')