Operadores de comparação OData no Azure AI Search - eq
, ne
, gt
, ge
lt
, ele
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 constantene
: Teste se um campo não é igual a um valor constante
Operadores de gama:
gt
: Teste se um campo é maior do que um valor constantelt
: Teste se um campo é menor que um valor constantege
: Teste se um campo é maior ou igual a um valor constantele
: 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 Edm.Double , resultando em uma perda de precisão para valores de grande magnitude |
Edm.Double |
Edm.Int32 |
n/d |
Edm.Int64 |
Edm.Double |
Comparações com NaN , -INF ou INF não são permitidas |
Edm.Int64 |
Edm.Int64 |
n/d |
Edm.Int64 |
Edm.Int32 |
A constante é convertida em antes da Edm.Int64 comparação |
Edm.Int32 |
Edm.Double |
Comparações com NaN , -INF ou 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, null
é igual apenas a si mesmo, 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, NaN
não é igual a qualquer valor, 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')