OData-jämförelseoperatorer i Azure AI Search – eq, ne, ltgt, , geochle

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ärde
  • ne: 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ärde
  • lt: Testa om ett fält är mindre än ett konstant värde
  • ge: Testa om ett fält är större än eller lika med ett konstant värde
  • le: 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.ismatchatt 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:

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.DateTimeOffsetmå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, -INFeller 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, -INFeller 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')

Nästa steg