Operadores lógicos OData no Azure AI Search - and
, or
, not
As expressões de filtro OData na Pesquisa de IA do Azure são expressões booleanas que avaliam para 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 booleana:
and
: Um operador binário que avalia setrue
suas subexpressões esquerda e direita avaliam comotrue
.or
: Um operador binário que avalia setrue
uma de suas subexpressões esquerda ou direita avalia comotrue
.not
: Um operador unário que avalia setrue
sua subexpressão é avaliada comofalse
, e vice-versa.
Estes, juntamente com os operadores any
de coleta e all
, permitem construir filtros que podem expressar critérios de pesquisa muito complexos.
Sintaxe
O seguinte EBNF (Extended Backus-Naur Form) define a gramática de uma expressão OData que usa os operadores lógicos.
logical_expression ::=
boolean_expression ('and' | 'or') boolean_expression
| 'not' boolean_expression
Um diagrama de sintaxe interativo também está disponível:
Nota
Consulte Referência de sintaxe de expressão OData para Azure AI Search para obter o EBNF completo.
Existem duas formas de expressões lógicas: binária (and
/or
), onde há duas subexpressões, e unária (not
), onde há apenas uma. As subexpressões podem ser expressões booleanas 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
true
booleanos oufalse
. - Outras expressões lógicas construídas usando
and
,or
, enot
.
Importante
Existem algumas situações em que nem todos os tipos de subexpressão podem ser usados com and
/or
, particularmente dentro de expressões lambda. Consulte Operadores de coleção OData na Pesquisa de IA do Azure para obter detalhes.
Operadores lógicos e null
A maioria das expressões booleanas, como funções e comparações, não pode produzir null
valores, e os operadores lógicos não podem ser aplicados ao null
literal diretamente (por exemplo, x and null
não é permitido). No entanto, os campos booleanos podem ser null
, então você precisa estar ciente de como os and
operadores , or
e not
se comportam na presença de null. Isso é resumido na tabela a seguir, onde 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 b
booleano aparece por si só em uma expressão de filtro, ele se comporta como se tivesse sido escrito b eq true
, então se b
é null
, a expressão é avaliada como false
. Da mesma forma, not b
comporta-se como not (b eq true)
, por isso avalia a true
. Desta forma, null
os campos comportam-se da mesma forma que false
. Isso é consistente com como eles se comportam quando combinados com outras expressões usando and
e or
, como mostrado na tabela acima. Apesar disso, uma comparação direta com false
(b eq false
) ainda avaliará a false
. Em outras palavras, null
não é igual a false
, embora se comporte como ele em expressões booleanas.
Exemplos
Correspondência de documentos onde o rating
campo está entre 3 e 5, inclusive:
rating ge 3 and rating le 5
Fazer corresponder documentos em que todos os elementos do campo são inferiores a ratings
3 ou superiores a 5:
ratings/all(r: r lt 3 or r gt 5)
Corresponder documentos onde o location
campo está dentro do polígono dado, 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')
Documentos correspondentes para hotéis em Vancouver, Canadá, onde há um quarto deluxe com uma tarifa 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)