Operátory porovnání OData ve službě Azure AI Search – eq
, ne
, gt
, lt
, ge
a le
Nejzásadnější operací ve výrazu filtru OData ve službě Azure AI Search je porovnání pole s danou hodnotou. Možné jsou dva typy porovnání – porovnání rovnosti a porovnání rozsahu. K porovnání pole s konstantní hodnotou můžete použít následující operátory:
Operátory rovnosti:
eq
: Test, zda je pole rovno konstantní hodnotěne
: Test, zda pole není rovno konstantní hodnotě
Operátory rozsahu:
gt
: Test, zda je pole větší než konstantní hodnotalt
: Test, zda je pole menší než konstantní hodnotage
: Test, zda je pole větší nebo rovno konstantní hodnotěle
: Test, zda je pole menší nebo rovno konstantní hodnotě
Operátory rozsahu můžete použít v kombinaci s logickými operátory a otestovat, jestli je pole v určitém rozsahu hodnot. Podívejte se na příklady dále v tomto článku.
Poznámka:
Pokud chcete, můžete konstantní hodnotu umístit na levou stranu operátoru a název pole na pravé straně. U operátorů rozsahu je význam porovnání obrácený. Pokud je například konstantní hodnota vlevo, otestuje, gt
jestli je konstantní hodnota větší než pole. Pomocí relačních operátorů můžete také porovnat výsledek funkce, například geo.distance
s hodnotou. U logických funkcí, jako search.ismatch
je například porovnávání výsledku true
nebo false
je volitelné.
Syntaxe
Následující ebNF (Extended Backus-Naur Form) definuje gramatiku výrazu OData, který používá relační operátory.
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'
K dispozici je také interaktivní diagram syntaxe:
Poznámka:
Úplný soubor EBNF najdete v referenčních informacích k syntaxi výrazů OData pro Azure AI Search .
Existují dvě formy porovnávacích výrazů. Jediným rozdílem mezi nimi je to, jestli se konstanta zobrazuje na levé nebo pravé straně operátoru. Výraz na druhé straně operátoru musí být proměnná nebo volání funkce. Proměnná může být buď název pole, nebo proměnná rozsahu v případě výrazu lambda.
Datové typy pro porovnání
Datové typy na obou stranách relačního operátoru musí být kompatibilní. Pokud je například levá strana pole typu Edm.DateTimeOffset
, musí být pravá strana konstantou data a času. Číselné datové typy jsou flexibilnější. Proměnné a funkce libovolného číselného typu můžete porovnat s konstantami jiného číselného typu s několika omezeními, jak je popsáno v následující tabulce.
Typ proměnné nebo funkce | Typ konstantní hodnoty | Omezení |
---|---|---|
Edm.Double |
Edm.Double |
Porovnání podléhá zvláštním pravidlům pro NaN |
Edm.Double |
Edm.Int64 |
Konstanta je převedena na , což vede ke Edm.Double ztrátě přesnosti pro hodnoty velké velikosti. |
Edm.Double |
Edm.Int32 |
Není k dispozici |
Edm.Int64 |
Edm.Double |
Porovnání s NaN , -INF nebo INF nejsou povoleny |
Edm.Int64 |
Edm.Int64 |
Není k dispozici |
Edm.Int64 |
Edm.Int32 |
Konstanta se převede na Edm.Int64 před porovnáním. |
Edm.Int32 |
Edm.Double |
Porovnání s NaN , -INF nebo INF nejsou povoleny |
Edm.Int32 |
Edm.Int64 |
Není k dispozici |
Edm.Int32 |
Edm.Int32 |
Není k dispozici |
Pro porovnání, která nejsou povolená, například porovnání pole typu Edm.Int64
s NaN
rozhraním REST API služby Azure AI Search, vrátí chybu HTTP 400: Chybný požadavek.
Důležité
I když jsou porovnání číselných typů flexibilní, důrazně doporučujeme psát porovnání ve filtrech, aby konstantní hodnota byla stejného datového typu jako proměnná nebo funkce, se kterou se porovnává. To je zvlášť důležité při kombinování hodnot s plovoucí desetinnou čárkou a celých čísel, kde jsou možné implicitní převody, které ztratí přesnost.
Zvláštní případy pro null
a NaN
Při použití operátorů porovnání je důležité si uvědomit, že všechna pole mimo kolekci ve službě Azure AI Search mohou být null
potenciálně . V následující tabulce jsou uvedeny všechny možné výsledky pro porovnávací výraz, kde může být null
na obou stranách:
Operátor | Výsledek, pokud je pouze pole nebo proměnná null |
Výsledek, pokud je pouze konstanta null |
Výsledek, pokud jsou pole nebo proměnná i konstanta null |
---|---|---|---|
gt |
false |
HTTP 400: Chyba chybný požadavek | HTTP 400: Chyba chybný požadavek |
lt |
false |
HTTP 400: Chyba chybný požadavek | HTTP 400: Chyba chybný požadavek |
ge |
false |
HTTP 400: Chyba chybný požadavek | HTTP 400: Chyba chybný požadavek |
le |
false |
HTTP 400: Chyba chybný požadavek | HTTP 400: Chyba chybný požadavek |
eq |
false |
false |
true |
ne |
true |
true |
false |
V souhrnu se null
rovná pouze sobě a není menší nebo větší než jakákoli jiná hodnota.
Pokud má index pole typu Edm.Double
a do těchto polí nahrajete NaN
hodnoty, budete pro to muset při psaní filtrů počítat. Azure AI Search implementuje standard IEEE 754 pro zpracování NaN
hodnot a porovnání s těmito hodnotami vytváří nestandardní výsledky, jak je znázorněno v následující tabulce.
Operátor | Výsledek, pokud je alespoň jeden operand NaN |
---|---|
gt |
false |
lt |
false |
ge |
false |
le |
false |
eq |
false |
ne |
true |
V souhrnu NaN
se nerovná žádné hodnotě, včetně samotné.
Porovnání geografických prostorových dat
Pole typu Edm.GeographyPoint
nelze přímo porovnat s konstantní hodnotou, ale funkci můžete použít geo.distance
. Tato funkce vrátí hodnotu typu Edm.Double
, takže ji můžete porovnat s číselnou konstantou pro filtrování na základě vzdálenosti od konstantních geografických souřadnic. Podívejte se na následující příklady .
Porovnání řetězcových dat
Řetězce se dají porovnat ve filtrech a zjistit přesné shody pomocí operátorů eq
a ne
operátorů. Tato porovnání rozlišují malá a velká písmena.
Příklady
Porovná dokumenty, ve kterých je pole v rozsahu Rating
3 až 5 včetně:
Rating ge 3 and Rating le 5
Porovná dokumenty, ve kterých Location
je pole menší než 2 kilometry od dané zeměpisné šířky a délky:
geo.distance(Location, geography'POINT(-122.031577 47.578581)') lt 2.0
Porovná dokumenty, ve kterých LastRenovationDate
je pole větší nebo rovno 1. lednu 2015, půlnoc UTC:
LastRenovationDate ge 2015-01-01T00:00:00.000Z
Porovná dokumenty, u Details/Sku
kterých pole není null
:
Details/Sku ne null
Spárujte dokumenty pro hotely, kde alespoň jeden pokoj má typ "Pokoj Deluxe", kde řetězec Rooms/Type
pole přesně odpovídá filtru:
Rooms/any(room: room/Type eq 'Deluxe Room')