Operadores de comparação OData no Azure AI Search - eq, , , gegtlt, neele

A operação mais básica em uma expressão de filtro OData na Pesquisa de IA do Azure é comparar um campo a um determinado valor. Dois tipos de comparação são possíveis: comparação de igualdade e comparação de intervalo. Você pode usar os seguintes operadores para comparar um campo com um valor constante:

Operadores de igualdade:

  • eq: Teste se um campo é igual a um valor constante
  • ne: Teste se um campo não é igual a um valor constante

Operadores de gama:

  • gt: Teste se um campo é maior do que um valor constante
  • lt: Teste se um campo é menor que um valor constante
  • ge: Teste se um campo é maior ou igual a um valor constante
  • le: Teste se um campo é menor ou igual a um valor constante

Você pode usar os operadores de intervalo em combinação com os operadores lógicos para testar se um campo está dentro de um determinado intervalo de valores. Veja os exemplos mais adiante neste artigo.

Nota

Se preferir, você pode colocar o valor constante no lado esquerdo do operador e o nome do campo no lado direito. Para os operadores de gama, o significado da comparação é invertido. Por exemplo, se o valor constante estiver à esquerda, gt testará se o valor constante é maior que o campo. Você também pode usar os operadores de comparação para comparar o resultado de uma função, como geo.distance, com um valor. Para funções booleanas como search.ismatch, comparando o resultado com true ou false é opcional.

Sintaxe

O seguinte EBNF (Extended Backus-Naur Form) define a gramática de uma expressão OData que usa os operadores de comparação.

comparison_expression ::=
    variable_or_function comparison_operator constant |
    constant comparison_operator variable_or_function

variable_or_function ::= variable | function_call

comparison_operator ::= 'gt' | 'lt' | 'ge' | 'le' | 'eq' | 'ne'

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 comparação. A única diferença entre eles é se a constante aparece no lado esquerdo ou direito do operador. A expressão do outro lado do operador deve ser uma variável ou uma chamada de função. Uma variável pode ser um nome de campo ou uma variável de intervalo no caso de uma expressão lambda.

Tipos de dados para comparações

Os tipos de dados em ambos os lados de um operador de comparação devem ser compatíveis. Por exemplo, se o lado esquerdo é um campo do tipo Edm.DateTimeOffset, então o lado direito deve ser uma constante de data-hora. Os tipos de dados numéricos são mais flexíveis. Você pode comparar variáveis e funções de qualquer tipo numérico com constantes de qualquer outro tipo numérico, com algumas limitações, conforme descrito na tabela a seguir.

Tipo de variável ou função Tipo de valor constante Limitações
Edm.Double Edm.Double A comparação está sujeita a regras especiais para NaN
Edm.Double Edm.Int64 A constante é convertida em , resultando em Edm.Doubleuma perda de precisão para valores de grande magnitude
Edm.Double Edm.Int32 n/a
Edm.Int64 Edm.Double Comparações com NaN, -INFou INF não são permitidas
Edm.Int64 Edm.Int64 n/a
Edm.Int64 Edm.Int32 A constante é convertida em antes da Edm.Int64 comparação
Edm.Int32 Edm.Double Comparações com NaN, -INFou INF não são permitidas
Edm.Int32 Edm.Int64 n/d
Edm.Int32 Edm.Int32 n/d

Para comparações que não são permitidas, como comparar um campo do tipo Edm.Int64 com NaN, a API REST do Azure AI Search retornará um erro "HTTP 400: Solicitação incorreta".

Importante

Embora as comparações de tipo numérico sejam flexíveis, é altamente recomendável escrever comparações em filtros para que o valor constante seja do mesmo tipo de dados que a variável ou função com a qual está sendo comparada. Isso é especialmente importante ao misturar valores de ponto flutuante e inteiro, onde conversões implícitas que perdem precisão são possíveis.

Casos especiais para null e NaN

Ao usar operadores de comparação, é importante lembrar que todos os campos que não são de coleta no Azure AI Search podem ser null. A tabela a seguir mostra todos os resultados possíveis para uma expressão de comparação onde ambos os lados podem ser null:

Operador Resultado quando apenas o campo ou variável é null Resultado quando apenas a constante é null Resultado quando o campo ou variável e a constante são null
gt false HTTP 400: Erro de solicitação incorreta HTTP 400: Erro de solicitação incorreta
lt false HTTP 400: Erro de solicitação incorreta HTTP 400: Erro de solicitação incorreta
ge false HTTP 400: Erro de solicitação incorreta HTTP 400: Erro de solicitação incorreta
le false HTTP 400: Erro de solicitação incorreta HTTP 400: Erro de solicitação incorreta
eq false false true
ne true true false

Em resumo, é igual apenas a si mesmo, null e não é menor ou maior do que qualquer outro valor.

Se o seu índice tiver campos do tipo Edm.Double e você carregar NaN valores para esses campos, você precisará levar isso em conta ao escrever filtros. O Azure AI Search implementa o padrão IEEE 754 para manipular NaN valores, e comparações com esses valores produzem resultados não óbvios, conforme mostrado na tabela a seguir.

Operador Resultado quando pelo menos um operando é NaN
gt false
lt false
ge false
le false
eq false
ne true

Em resumo, não é igual a qualquer valor, NaN inclusive a si mesmo.

Comparação de dados geoespaciais

Não é possível comparar diretamente um campo do tipo Edm.GeographyPoint com um valor constante, mas é possível usar a geo.distance função. Esta função retorna um valor do tipo Edm.Double, para que você possa compará-lo com uma constante numérica para filtrar com base na distância de coordenadas geoespaciais constantes. Veja os exemplos abaixo.

Comparando dados de cadeia de caracteres

As cadeias de caracteres podem ser comparadas em filtros para correspondências exatas usando os eq operadores e ne . Estas comparações diferenciam maiúsculas de minúsculas.

Exemplos

Correspondência de documentos onde o Rating campo está entre 3 e 5, inclusive:

Rating ge 3 and Rating le 5

Combine documentos quando o campo estiver a Location menos de 2 quilômetros da latitude e longitude dadas:

geo.distance(Location, geography'POINT(-122.031577 47.578581)') lt 2.0

Corresponder documentos em que o LastRenovationDate campo é maior ou igual a 1 de janeiro de 2015, meia-noite UTC:

LastRenovationDate ge 2015-01-01T00:00:00.000Z

Correspondência de documentos onde o Details/Sku campo não nullé :

Details/Sku ne null

Corresponder documentos para hotéis em que pelo menos um quarto tem o tipo "Quarto Deluxe", onde a Rooms/Type cadeia do campo corresponde exatamente ao filtro:

Rooms/any(room: room/Type eq 'Deluxe Room')

Próximos passos