Operatory porównania OData w usłudze Azure AI Search — eq, , negt, ltge, 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ści
  • ne: Testowanie, czy pole nie jest równe stałej wartości

Operatory zakresu:

  • gt: Testowanie, czy pole jest większe niż wartość stała
  • lt: Testowanie, czy pole jest mniejsze niż wartość stała
  • ge: Testowanie, czy pole jest większe, czy równe stałej wartości
  • le: 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, -INFlub 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, -INFlub 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 nullNaN

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 nulljest 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')

Następne kroki