Operadores lógicos OData no Azure AI Search - and, , ornot

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 se true suas subexpressões esquerda e direita avaliam como true.
  • or: Um operador binário que avalia se true uma de suas subexpressões esquerda ou direita avalia como true.
  • not: Um operador unário que avalia se true sua subexpressão é avaliada como false, e vice-versa.

Estes, juntamente com os operadores any de recolha eall , 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 (), onde há duas subexpressões, e unária (and/ornot), 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, 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 true booleanos ou false.
  • Outras expressões lógicas construídas usando and, , ore not.

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 andoperadores , ore 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 sozinho em uma expressão de filtro, ele se comporta como se tivesse sido escrito b eq true, portanto, se b é null, a expressão é avaliada como false. Da mesma forma, comporta-se como not (b eq true), not b 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, não é igual a false, null 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 3 ou superiores a ratings 5:

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

Corresponder documentos onde o campo está dentro do polígono dado, e o documento não contém o location 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)

Próximos passos