Логические операторы OData в поиске ИИ Azure — and, ornot

Выражения фильтров OData в поиске ИИ Azure — это логические выражения, которые оценивают true или false. Вы можете создать сложный фильтр, записав ряд простых фильтров и объединив их с помощью логических операторов из логической алгебры:

  • and. Бинарный оператор, возвращающий значение true, если результат вычисления левого и правого операндов имеет значение true.
  • or. Бинарный оператор, возвращающий значение true, если результат вычисления левого или правого операнда имеет значение true.
  • not. Унарный оператор, возвращающий значение true, если его операнд имеет значение false, и наоборот.

Все это вместе с операторами коллекций any и all позволяет создавать фильтры, которые могут выражать очень сложные условия поиска.

Синтаксис

Приведенная далее EBNF (расширенная форма Бэкуса-Наура) определяет грамматику выражения OData, в котором используются логические операторы.

logical_expression ::=
    boolean_expression ('and' | 'or') boolean_expression
    | 'not' boolean_expression

Кроме того, вам может помочь интерактивная схема синтаксиса:

Примечание.

См . справочник по синтаксису выражений OData для поиска ИИ Azure для полного EBNF.

Существует две формы логических выражений: двоичные (and/or), где есть два операнда, и унарные (not) с одним операндом. Операнды могут быть логическими выражениями любого типа:

  • Поля или переменные диапазона типа Edm.Boolean.
  • Функции, возвращающие значения типа Edm.Boolean, такие как geo.intersects или search.ismatch.
  • Выражения сравнения, такие как rating gt 4.
  • Выражения коллекции, такие как Rooms/any(room: room/Type eq 'Deluxe Room').
  • Логические литералы true или false.
  • Другие логические выражения, созданные с помощью and, or и not.

Важно!

Существуют ситуации, когда не все виды операндов можно использовать с and/or, особенно внутри лямбда-выражений. Дополнительные сведения см. в операторах сбора OData в поиске ИИ Azure.

Логические операторы и null

Большинство логических выражений, таких как функции и сравнения, не могут формировать значения null, а логические операторы не могут применяться к литералу null напрямую (например, x and null не допускается). Однако логические поля могут быть со значением null, поэтому необходимо знать, как операторы and, or и not работают при наличии значения NULL. Это обобщено в следующей таблице, где b — поле типа Edm.Boolean:

Выражение Результат, если b имеет значение null
b false
not b true
b eq true false
b eq false false
b eq null true
b ne true true
b ne false true
b ne null false
b and true false
b and false false
b or true true
b or false false

Если логическое поле b присутствует в критерии фильтра, оно ведет себя так, как если бы оно было записано как b eq true, поэтому если b имеет значение null, то выражение принимает значение false. Аналогично not b ведет себя как not (b eq true), поэтому принимает значение true. Таким образом, поля null ведут себя так же, как и false. Это согласуется с тем, как они работают при объединении с другими выражениями с помощью and и or (показано в таблице выше). Несмотря на это, прямое сравнение false (b eq false) по-прежнему будет иметь значение false. Другими словами, null не равно false, даже если оно работает как в логических выражениях.

Примеры

Найти документы, в которых значение в поле rating лежит в диапазоне между 3 и 5 включительно:

    rating ge 3 and rating le 5

Сопоставить документы, в которых все элементы поля ratings имеют значение меньше 3 или больше 5:

    ratings/all(r: r lt 3 or r gt 5)

Сопоставить документы, в которых поле location находится внутри заданного многоугольника, а документ не содержит термин public.

    geo.intersects(location, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))') and not search.ismatch('public')

Сопоставить документы для гостиниц в Vancouver, Canada (Ванкувере (Канада)), в которых упоминается deluxe room (комната повышенной комфортности) с базовым тарифом меньше 160:

    Address/City eq 'Vancouver' and Address/Country eq 'Canada' and Rooms/any(room: room/Type eq 'Deluxe Room' and room/BaseRate lt 160)

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