Логические операторы OData в поиске ИИ Azure — and
, or
not
Выражения фильтров 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
:
Expression | Результат, если 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)