Operadores lógicos OData no Azure AI Search – and
, or
, not
Expressões de filtro OData no Azure AI Search são expressões boolianas avaliadas como true
ou false
. Você pode escrever um filtro complexo escrevendo uma série de filtros mais simples e compondo-os usando os operadores lógicos da álgebra booliana:
and
: um operador binário que será avaliado comotrue
se as subexpressões esquerda e direita forem avaliadas comotrue
.or
: um operador binário que será avaliado comotrue
se uma das subexpressões esquerda ou direita for avaliada comotrue
.not
: um operador unário que será avaliado comotrue
se a subexpressão for avaliada comofalse
e vice-versa.
Em conjunto com os operadores de coleção any
e all
, eles permitem que você construa filtros que podem expressar critérios de pesquisa muito complexos.
Sintaxe
A EBNF (forma estendida de Backus-Naur) a seguir define a gramática de uma expressão OData que usa operadores lógicos.
logical_expression ::=
boolean_expression ('and' | 'or') boolean_expression
| 'not' boolean_expression
Um diagrama de sintaxe interativa também está disponível:
Observação
Confira Referência de sintaxe de expressão OData para Azure AI Search para ver a EBNF completa.
Há duas formas de expressões lógicas: binária (and
/or
), em que há duas subexpressões, e unária (not
), em que há apenas uma. As subexpressões podem ser expressões boolianas de qualquer tipo:
- Campos ou variáveis de intervalo do tipo
Edm.Boolean
- Funções que retornam valores do tipo
Edm.Boolean
, comogeo.intersects
ousearch.ismatch
- Expressões de comparação, como
rating gt 4
- Expressões de coleção, como
Rooms/any(room: room/Type eq 'Deluxe Room')
- Os literais boolianos
true
oufalse
. - Outras expressões lógicas construídas usando
and
,or
enot
.
Importante
Há algumas situações em que nem todos os tipos de subexpressão podem ser usados com and
/or
, especialmente dentro de expressões lambda. Confira Operadores de coleção OData no Azure AI Search para obter detalhes.
Operadores lógicos e null
A maioria das expressões boolianas, como funções e comparações, não pode produzir valores null
, e os operadores lógicos não podem ser aplicados diretamente ao literal null
(por exemplo, x and null
não é permitido). No entanto, os campos boolianos podem ser null
. Sendo assim, você precisa estar ciente de como os operadores and
, or
e not
se comportam na presença de null. Isso é resumido na seguinte tabela, em que b
é um campo do tipo Edm.Boolean
:
Expression | Resultado quando 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 |
Quando um campo booliano b
aparece sozinho em uma expressão de filtro, ele se comporta como se tivesse sido escrito b eq true
. Portanto, se b
for null
, a expressão será avaliada como false
. Da mesmo modo, not b
comporta-se como not (b eq true)
. Portanto, ele é avaliado como true
. Dessa forma, os campos null
se comportam da mesma maneira que false
. Isso é consistente com o modo como eles se comportam quando combinados com outras expressões usando and
e or
, conforme mostrado na tabela acima. Apesar disso, uma comparação direta com false
(b eq false
) ainda será avaliada como false
. Em outras palavras, null
não é igual a false
, embora ambos se comportem da mesma maneira em expressões boolianas.
Exemplos
Corresponder documentos em que o campo rating
está entre 3 e 5, inclusive:
rating ge 3 and rating le 5
Corresponder documentos em que todos os elementos do campo ratings
são menores que três ou maiores que cinco:
ratings/all(r: r lt 3 or r gt 5)
Corresponder documentos em que o campo location
está dentro do polígono fornecido, e o documento não contém o termo "público".
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')
Corresponder documentos para hotéis em Vancouver, Canadá, em que há um quarto de luxo com uma taxa base inferior a 160:
Address/City eq 'Vancouver' and Address/Country eq 'Canada' and Rooms/any(room: room/Type eq 'Deluxe Room' and room/BaseRate lt 160)