OData-jämförelseoperatorer i Azure AI Search – eq
, ne
, lt
gt
, , ge
ochle
Den mest grundläggande åtgärden i ett OData-filteruttryck i Azure AI Search är att jämföra ett fält med ett visst värde. Två typer av jämförelse är möjliga – likhetsjämförelse och intervalljämförelse. Du kan använda följande operatorer för att jämföra ett fält med ett konstant värde:
Likhetsoperatorer:
eq
: Testa om ett fält är lika med ett konstant värdene
: Testa om ett fält inte är lika med ett konstant värde
Intervalloperatorer:
gt
: Testa om ett fält är större än ett konstant värdelt
: Testa om ett fält är mindre än ett konstant värdege
: Testa om ett fält är större än eller lika med ett konstant värdele
: Testa om ett fält är mindre än eller lika med ett konstant värde
Du kan använda intervalloperatorerna i kombination med de logiska operatorerna för att testa om ett fält ligger inom ett visst värdeintervall. Se exemplen senare i den här artikeln.
Kommentar
Om du vill kan du placera det konstanta värdet till vänster om operatorn och fältnamnet till höger. För intervalloperatorer är innebörden av jämförelsen omvänd. Om till exempel konstantvärdet är till vänster gt
skulle du testa om konstantvärdet är större än fältet. Du kan också använda jämförelseoperatorerna för att jämföra resultatet av en funktion, till exempel geo.distance
, med ett värde. För booleska funktioner som search.ismatch
att jämföra resultatet med true
eller false
är valfritt.
Syntax
Följande EBNF (Extended Backus-Naur Form) definierar grammatiken för ett OData-uttryck som använder jämförelseoperatorerna.
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'
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 jämförelseuttryck. Den enda skillnaden mellan dem är om konstanten visas till vänster eller höger i operatorn. Uttrycket på andra sidan operatorn måste vara en variabel eller ett funktionsanrop. En variabel kan vara antingen ett fältnamn eller en intervallvariabel när det gäller ett lambda-uttryck.
Datatyper för jämförelser
Datatyperna på båda sidor av en jämförelseoperator måste vara kompatibla. Om den vänstra sidan till exempel är ett fält av typen Edm.DateTimeOffset
måste höger sida vara en konstant för datum-tid. Numeriska datatyper är mer flexibla. Du kan jämföra variabler och funktioner av valfri numerisk typ med konstanter av någon annan numerisk typ, med några begränsningar, enligt beskrivningen i följande tabell.
Variabel eller funktionstyp | Konstant värdetyp | Begränsningar |
---|---|---|
Edm.Double |
Edm.Double |
Jämförelse omfattas av särskilda regler för NaN |
Edm.Double |
Edm.Int64 |
Konstanten konverteras till Edm.Double , vilket resulterar i en förlust av precision för värden av stor storlek |
Edm.Double |
Edm.Int32 |
saknas |
Edm.Int64 |
Edm.Double |
Jämförelser med NaN , -INF eller INF tillåts inte |
Edm.Int64 |
Edm.Int64 |
saknas |
Edm.Int64 |
Edm.Int32 |
Konstant konverteras till Edm.Int64 före jämförelse |
Edm.Int32 |
Edm.Double |
Jämförelser med NaN , -INF eller INF tillåts inte |
Edm.Int32 |
Edm.Int64 |
saknas |
Edm.Int32 |
Edm.Int32 |
saknas |
För jämförelser som inte är tillåtna, till exempel att jämföra ett fält av typen Edm.Int64
med NaN
, returnerar REST-API:et för Azure AI Search ett "HTTP 400: Bad Request"-fel.
Viktigt!
Även om jämförelser av numeriska typer är flexibla rekommenderar vi starkt att du skriver jämförelser i filter så att det konstanta värdet har samma datatyp som variabeln eller funktionen som den jämförs med. Detta är särskilt viktigt när du blandar flyttals- och heltalsvärden, där implicita konverteringar som förlorar precision är möjliga.
Specialfall för null
och NaN
När du använder jämförelseoperatorer är det viktigt att komma ihåg att alla fält som inte är samlingsfält i Azure AI Search potentiellt kan vara null
. I följande tabell visas alla möjliga resultat för ett jämförelseuttryck där båda sidor kan vara null
:
Operator | Resultat när endast fältet eller variabeln är null |
Resultat när endast konstanten är null |
Resultat när både fältet eller variabeln och konstanten är null |
---|---|---|---|
gt |
false |
HTTP 400: Fel vid felaktig begäran | HTTP 400: Fel vid felaktig begäran |
lt |
false |
HTTP 400: Fel vid felaktig begäran | HTTP 400: Fel vid felaktig begäran |
ge |
false |
HTTP 400: Fel vid felaktig begäran | HTTP 400: Fel vid felaktig begäran |
le |
false |
HTTP 400: Fel vid felaktig begäran | HTTP 400: Fel vid felaktig begäran |
eq |
false |
false |
true |
ne |
true |
true |
false |
Sammanfattningsvis null
är lika med sig själv och är inte mindre eller större än något annat värde.
Om ditt index har fält av typen Edm.Double
och du laddar upp NaN
värden till dessa fält måste du ta hänsyn till det när du skriver filter. Azure AI Search implementerar IEEE 754-standarden för hantering av NaN
värden, och jämförelser med sådana värden ger icke-uppenbara resultat, som visas i följande tabell.
Operator | Resultat när minst en operand är NaN |
---|---|
gt |
false |
lt |
false |
ge |
false |
le |
false |
eq |
false |
ne |
true |
Sammanfattningsvis NaN
är inte lika med något värde, inklusive sig självt.
Jämföra geo-spatiala data
Du kan inte jämföra ett fält av typen Edm.GeographyPoint
direkt med ett konstant värde, men du kan använda geo.distance
funktionen. Den här funktionen returnerar ett värde av typen Edm.Double
, så att du kan jämföra det med en numerisk konstant för att filtrera baserat på avståndet från konstanta geo-spatiala koordinater. Se exemplen nedan.
Jämföra strängdata
Strängar kan jämföras i filter för exakta matchningar med operatorerna eq
och ne
. Dessa jämförelser är skiftlägeskänsliga.
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 fältet Location
är mindre än 2 kilometer från den angivna latitud och longitud:
geo.distance(Location, geography'POINT(-122.031577 47.578581)') lt 2.0
Matcha dokument där fältet LastRenovationDate
är större än eller lika med 1 januari 2015, midnatt UTC:
LastRenovationDate ge 2015-01-01T00:00:00.000Z
Matcha dokument där fältet Details/Sku
inte null
är :
Details/Sku ne null
Matcha dokument för hotell där minst ett rum har typen "Deluxe Room", där fältets Rooms/Type
sträng matchar filtret exakt:
Rooms/any(room: room/Type eq 'Deluxe Room')