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 como true se as subexpressões esquerda e direita forem avaliadas como true.
  • or: um operador binário que será avaliado como true se uma das subexpressões esquerda ou direita for avaliada como true.
  • not: um operador unário que será avaliado como true se a subexpressão for avaliada como false 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, como geo.intersects ou search.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 ou false.
  • Outras expressões lógicas construídas usando and, or e not.

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)

Próximas etapas