Операторы сравнения OData в поиске ИИ Azure — eq, ne, gt, ltи gele

Основная операция в выражении фильтра 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.Int64NaNс, 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')

Следующие шаги