Operatory porównania OData w usłudze Azure AI Search — eq
, , ne
gt
, lt
ge
, ile
Najbardziej podstawową operacją w wyrażeniu filtru OData w usłudze Azure AI Search jest porównanie pola z daną wartością. Możliwe są dwa typy porównania — porównanie równości i porównanie zakresów. Aby porównać pole z stałą wartością, możesz użyć następujących operatorów:
Operatory równości:
eq
: Testowanie, czy pole jest równe stałej wartościne
: Testowanie, czy pole nie jest równe stałej wartości
Operatory zakresu:
gt
: Testowanie, czy pole jest większe niż wartość stałalt
: Testowanie, czy pole jest mniejsze niż wartość stałage
: Testowanie, czy pole jest większe, czy równe stałej wartościle
: Testowanie, czy pole jest mniejsze, czy równe stałej wartości
Operatory zakresu można używać w połączeniu z operatorami logicznymi, aby sprawdzić, czy pole znajduje się w określonym zakresie wartości. Zapoznaj się z przykładami w dalszej części tego artykułu.
Uwaga
Jeśli wolisz, możesz umieścić stałą wartość po lewej stronie operatora i nazwę pola po prawej stronie. W przypadku operatorów zakresu znaczenie porównania jest odwrócone. Jeśli na przykład wartość stała znajduje się po lewej stronie, sprawdź, gt
czy wartość stała jest większa niż pole. Możesz również użyć operatorów porównania, aby porównać wynik funkcji, na przykład geo.distance
, z wartością. W przypadku funkcji logicznych, takich jak search.ismatch
, porównywanie wyniku z true
lub false
jest opcjonalne.
Składnia
Poniższy formularz EBNF (extended Backus-Naur Form) definiuje gramatykę wyrażenia OData korzystającego z operatorów porównania.
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'
Dostępny jest również interakcyjny diagram składni:
Uwaga
Zobacz dokumentację składni wyrażeń OData dla usługi Azure AI Search , aby zapoznać się z pełną pełną NF.
Istnieją dwie formy wyrażeń porównania. Jedyną różnicą między nimi jest to, czy stała pojawia się po lewej lub prawej stronie operatora. Wyrażenie po drugiej stronie operatora musi być zmienną lub wywołaniem funkcji. Zmienna może być nazwą pola lub zmienną zakresu w przypadku wyrażenia lambda.
Typy danych dla porównań
Typy danych po obu stronach operatora porównania muszą być zgodne. Jeśli na przykład lewa strona jest polem typu Edm.DateTimeOffset
, po prawej stronie musi być stała data-godzina. Typy danych liczbowych są bardziej elastyczne. Zmienne i funkcje dowolnego typu liczbowego można porównać z stałymi dowolnego innego typu liczbowego, z kilkoma ograniczeniami, zgodnie z opisem w poniższej tabeli.
Typ zmiennej lub funkcji | Typ wartości stałej | Ograniczenia |
---|---|---|
Edm.Double |
Edm.Double |
Porównanie podlega specjalnym zasadom NaN |
Edm.Double |
Edm.Int64 |
Stała jest konwertowana na Edm.Double , co powoduje utratę dokładności dla wartości o dużej wielkości |
Edm.Double |
Edm.Int32 |
nie dotyczy |
Edm.Int64 |
Edm.Double |
Porównania z NaN , -INF lub INF są niedozwolone |
Edm.Int64 |
Edm.Int64 |
nie dotyczy |
Edm.Int64 |
Edm.Int32 |
Stała jest konwertowana na Edm.Int64 przed porównaniem |
Edm.Int32 |
Edm.Double |
Porównania z NaN , -INF lub INF są niedozwolone |
Edm.Int32 |
Edm.Int64 |
nie dotyczy |
Edm.Int32 |
Edm.Int32 |
nie dotyczy |
W przypadku porównań, które nie są dozwolone, takich jak porównanie pola typu Edm.Int64
z NaN
, interfejs API REST usługi Azure AI Search zwróci błąd "HTTP 400: Nieprawidłowe żądanie".
Ważne
Mimo że porównania typów liczbowych są elastyczne, zdecydowanie zalecamy pisanie porównań w filtrach, tak aby stała wartość była tego samego typu danych co zmienna lub funkcja, do której jest porównywana. Jest to szczególnie ważne w przypadku mieszania wartości zmiennoprzecinkowych i całkowitych, gdzie możliwe są niejawne konwersje, które tracą precyzję.
Przypadki specjalne dla i null
NaN
Podczas korzystania z operatorów porównania należy pamiętać, że wszystkie pola inne niż kolekcje w usłudze Azure AI Search mogą potencjalnie mieć wartość null
. W poniższej tabeli przedstawiono wszystkie możliwe wyniki dla wyrażenia porównania, gdzie każda strona może mieć wartość null
:
Operator | Wynik, gdy tylko pole lub zmienna jest null |
Wynik, gdy tylko stała jest null |
Wynik, gdy zarówno pole, jak i zmienna są stałe null |
---|---|---|---|
gt |
false |
HTTP 400: Błąd nieprawidłowego żądania | HTTP 400: Błąd nieprawidłowego żądania |
lt |
false |
HTTP 400: Błąd nieprawidłowego żądania | HTTP 400: Błąd nieprawidłowego żądania |
ge |
false |
HTTP 400: Błąd nieprawidłowego żądania | HTTP 400: Błąd nieprawidłowego żądania |
le |
false |
HTTP 400: Błąd nieprawidłowego żądania | HTTP 400: Błąd nieprawidłowego żądania |
eq |
false |
false |
true |
ne |
true |
true |
false |
Podsumowując, null
jest równa tylko samej sobie i nie jest mniejsza lub większa niż jakakolwiek inna wartość.
Jeśli indeks zawiera pola typu Edm.Double
i przekazujesz NaN
wartości do tych pól, musisz je uwzględnić podczas pisania filtrów. Usługa Azure AI Search implementuje standard IEEE 754 do obsługi NaN
wartości, a porównania z takimi wartościami generują nieoczywiste wyniki, jak pokazano w poniższej tabeli.
Operator | Wynik, gdy co najmniej jeden operand jest NaN |
---|---|
gt |
false |
lt |
false |
ge |
false |
le |
false |
eq |
false |
ne |
true |
Podsumowując, NaN
nie jest równa żadnej wartości, w tym samej.
Porównywanie danych geoprzestrzennych
Nie można bezpośrednio porównać pola typu Edm.GeographyPoint
z stałą wartością, ale można użyć geo.distance
funkcji . Ta funkcja zwraca wartość typu Edm.Double
, aby można było porównać ją ze stałą liczbową w celu filtrowania na podstawie odległości od stałych współrzędnych geograficznych. Zapoznaj się z poniższymi przykładami .
Porównywanie danych ciągów
Ciągi można porównać w filtrach pod kątem dokładnych dopasowań przy użyciu eq
operatorów i ne
. Te porównania są wrażliwe na wielkość liter.
Przykłady
Dopasuj Rating
dokumenty z zakresu od 3 do 5 włącznie:
Rating ge 3 and Rating le 5
Dopasuj Location
dokumenty, w których pole jest mniejsze niż 2 kilometry od danej szerokości geograficznej i długości geograficznej:
geo.distance(Location, geography'POINT(-122.031577 47.578581)') lt 2.0
Dopasuj LastRenovationDate
dokumenty, w których pole jest większe lub równe 1 stycznia 2015 r., północ UTC:
LastRenovationDate ge 2015-01-01T00:00:00.000Z
Dopasuj dokumenty, Details/Sku
w których pole nie null
jest następujące:
Details/Sku ne null
Dopasuj dokumenty dla hoteli, w których co najmniej jeden pokój ma typ "Deluxe Room", gdzie ciąg Rooms/Type
pola pasuje dokładnie do filtru:
Rooms/any(room: room/Type eq 'Deluxe Room')