Sdílet prostřednictvím


Operátory porovnání OData ve službě Azure AI Search – eq, ne, gt, lt, gea 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í hodnota
  • lt: Test, zda je pole menší než konstantní hodnota
  • ge: 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.distances hodnotou. U logických funkcí, jako search.ismatchje 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:

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.Doubleztrátě přesnosti pro hodnoty velké velikosti.
Edm.Double Edm.Int32 Není k dispozici
Edm.Int64 Edm.Double Porovnání s NaN, -INFnebo 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, -INFnebo 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 NaNrozhraní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 nullpotenciálně . V následující tabulce jsou uvedeny všechny možné výsledky pro porovnávací výraz, kde může být nullna 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')

Další kroky