Операторы сравнения OData в поиске ИИ Azure — eq
, ne
, gt
, lt
и ge
le
Основная операция в выражении фильтра OData в поиске ИИ Azure — сравнение поля с заданным значением. Возможны два типа сравнения — сравнение на равенство и сравнение диапазонов. Для сравнения поля с постоянным значением можно использовать следующие операторы:
Операторы равенства:
eq
: проверяет, является ли поле равным постоянному значению.ne
: проверяет, является ли поле не равным постоянному значению.
Операторы диапазона:
gt
: проверяет, больше ли поле постоянного значения.lt
: проверяет, меньше ли поле постоянного значения.ge
: проверяет, больше или равно поле постоянному значению.le
: проверяет, меньше или равно поле постоянному значению.
Для проверки того, находится ли поле в определенном диапазоне значений, можно использовать операторы диапазона в сочетании с логическими операторами. См. примеры далее в этой статье.
Примечание.
При желании можно разместить константу в левой части оператора, а имя поля — в правой. Для операторов диапазона значение сравнения изменяется на противоположное. Например, если значение константы находится слева, gt
будет проверять, больше ли значение константы, чем поле. Операторы сравнения также можно использовать для сравнения результатов функции, например geo.distance
, с определенным значением. Для логических функций, таких как search.ismatch
, сравнение результата с true
или false
является необязательным.
Синтаксис
Приведенная далее EBNF (расширенная форма Бэкуса — Наура) определяет грамматику выражения OData, в котором используются операторы сравнения.
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'
Кроме того, вам может помочь интерактивная схема синтаксиса:
Примечание.
См . справочник по синтаксису выражений OData для поиска ИИ Azure для полного EBNF.
Существует две формы выражений сравнения. Единственное различие между ними заключается в том, стоит ли константа в левой или правой части оператора. Выражение на другой стороне оператора должно быть переменной или вызовом функции. Переменная может быть именем поля или переменной диапазона в случае лямбда-выражения.
Типы данных для сравнений
Типы данных с обеих сторон оператора сравнения должны быть совместимыми. Например, если левая часть является полем типа Edm.DateTimeOffset
, то правая часть должна быть константой даты и времени. Числовые типы данных являются более гибкими. Переменные и функции любого числового типа можно сравнивать с константами любого другого числового типа с некоторыми ограничениями, как описано в таблице ниже.
Тип переменной или функции | Тип значения константы | Ограничения |
---|---|---|
Edm.Double |
Edm.Double |
При сравнении действуют специальные правила в отношении NaN . |
Edm.Double |
Edm.Int64 |
Константа преобразуется в Edm.Double , что приводит к потере точности для значений большой величины. |
Edm.Double |
Edm.Int32 |
Н/Д |
Edm.Int64 |
Edm.Double |
Сравнения с NaN , -INF и INF не допускаются. |
Edm.Int64 |
Edm.Int64 |
Н/Д |
Edm.Int64 |
Edm.Int32 |
Константа преобразуется в Edm.Int64 перед сравнением. |
Edm.Int32 |
Edm.Double |
Сравнения с NaN , -INF и INF не допускаются. |
Edm.Int32 |
Edm.Int64 |
Недоступно |
Edm.Int32 |
Edm.Int32 |
Недоступно |
Для сравнения, которые не разрешены, например сравнение поля типа Edm.Int64
NaN
с, REST API поиска Azure вернет ошибку HTTP 400: "Недопустимый запрос".
Внимание
Хотя возможности для сравнения числовых типов являются более гибкими, мы настоятельно рекомендуем использовать сравнения в фильтрах таким образом, чтобы значение константы совпадало с типом данных переменной или функции, с которой выполняется сравнение. Это особенно важно при одновременном использовании значений с плавающей запятой и целых чисел, где возможны неявные преобразования с потерей точности.
Особые случаи для null
и NaN
При использовании операторов сравнения важно помнить, что все поля, отличные от коллекции в службе "Поиск ИИ Azure", могут быть null
потенциально. В таблице ниже показаны все возможные результаты для выражения сравнения, где с любой из сторон может быть null
.
Оператор | Результат, если только поле или переменная имеет значение null |
Результат, если только константа имеет значение null |
Результат, если как поле или переменная, так и константа имеют значение null |
---|---|---|---|
gt |
false |
Ошибка "HTTP 400: неверный запрос" | Ошибка "HTTP 400: неверный запрос" |
lt |
false |
Ошибка "HTTP 400: неверный запрос" | Ошибка "HTTP 400: неверный запрос" |
ge |
false |
Ошибка "HTTP 400: неверный запрос" | Ошибка "HTTP 400: неверный запрос" |
le |
false |
Ошибка "HTTP 400: неверный запрос" | Ошибка "HTTP 400: неверный запрос" |
eq |
false |
false |
true |
ne |
true |
true |
false |
Можно сказать, что значение null
равно только самому себе и не является меньше или больше какого-либо другого значения.
Если в индексе есть поля типа Edm.Double
и вы загружаете в эти поля значения NaN
, необходимо учитывать это при составлении фильтров. Поиск ИИ Azure реализует стандарт IEEE 754 для обработки NaN
значений и сравнения с такими значениями, как показано в следующей таблице.
Оператор | Результат, если хотя бы один операнд имеет значение NaN |
---|---|
gt |
false |
lt |
false |
ge |
false |
le |
false |
eq |
false |
ne |
true |
Можно сказать, что значение NaN
не равно никакому другому значению, включая его само.
Сравнение геопространственных данных
Сравнивать поле типа Edm.GeographyPoint
с постоянным значением напрямую нельзя, но можно использовать функцию geo.distance
. Эта функция возвращает значение типа Edm.Double
, которое можно сравнить с числовой константой для фильтрации по расстоянию от фиксированных геопространственных координат. См. примеры ниже.
Сравнение строковых данных
Строки можно сравнивать в фильтрах на предмет точного совпадения с помощью операторов eq
и ne
. При сравнении строк учитывается регистр.
Примеры
Найти документы, в которых значение в поле Rating
лежит в диапазоне между 3 и 5 включительно:
Rating ge 3 and Rating le 5
Найти документы, в которых значение в поле Location
находится на расстоянии меньше 2 километров от заданных координат широты и долготы:
geo.distance(Location, geography'POINT(-122.031577 47.578581)') lt 2.0
Найти документы, в которых значение в поле LastRenovationDate
больше или равно 1 января 2015 г., полночь по UTC:
LastRenovationDate ge 2015-01-01T00:00:00.000Z
Найти документы, в которых значение в поле Details/Sku
не равно null
:
Details/Sku ne null
Найти документов для гостиниц, где по меньшей мере один номер относится к типу "Deluxe Room" (Номер люкс), а строка поля Rooms/Type
в точности соответствует фильтру:
Rooms/any(room: room/Type eq 'Deluxe Room')