Operadores de comparación de OData en Azure AI Search: eq
, ne
, gt
, lt
, ge
y le
La operación más básica en una expresión de filtro de OData de Azure AI Search consiste en comparar un campo con un valor determinado. Hay dos tipos de comparación posibles: comparación de igualdad y comparación de rango. Puede usar los operadores siguientes para comparar un campo con un valor constante:
Operadores de igualdad:
eq
: se comprueba si un campo es igual a un valor constante.ne
: se comprueba si un campo no es igual a un valor constante.
Operadores de rango:
gt
: se comprueba si un campo es mayor que un valor constante.lt
: se comprueba si un campo es menor que un valor constante.ge
: se comprueba si un campo es mayor o igual que un valor constante.le
: se comprueba si un campo es menor o igual que un valor constante.
Puede usar los operadores de rango en combinación con los operadores lógicos para comprobar si un campo está dentro de un intervalo de valores determinado. Vea los ejemplos más adelante en este artículo.
Nota:
Si lo prefiere, puede colocar el valor constante en el lado izquierdo del operador y el nombre del campo en el lado derecho. Para los operadores de rango, se invierte el significado de la comparación. Por ejemplo, si es el valor constante está a la izquierda, gt
podría probar si el valor constante es mayor que el campo. También puede usar los operadores de comparación para comparar el resultado de una función, como geo.distance
, con un valor. Para las funciones booleanas como search.ismatch
, la comparación del resultado con true
o false
es opcional.
Sintaxis
En la siguiente EBNF (forma de Backus-Naur extendida) se define la gramática de una expresión de OData en la que se usan los operadores de comparación.
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'
También está disponible un diagrama de sintaxis interactivo:
Nota:
Consulta Referencia de sintaxis de expresiones OData para Azure AI Search para obtener la EBNF completa.
Hay dos formas de expresiones de comparación. La única diferencia entre las dos es si la constante aparece en el lado izquierdo o derecho del operador. La expresión en el otro lado del operador debe ser una variable o una llamada de función. Una variable puede ser un nombre de campo o una variable de rango en el caso de una expresión lambda.
Tipos de datos para las comparaciones
Los tipos de datos en ambos lados de un operador de comparación deben ser compatibles. Por ejemplo, si el lado izquierdo es un campo de tipo Edm.DateTimeOffset
, el lado derecho debe ser una constante de fecha y hora. Los tipos de datos numéricos son más flexibles. Puede comparar variables y funciones de cualquier tipo numérico con constantes de cualquier otro tipo numérico, con algunas limitaciones, como se describe en la tabla siguiente.
Tipo de variable o función | Tipo de valor constante | Limitaciones |
---|---|---|
Edm.Double |
Edm.Double |
La comparación está sujeta a reglas especiales para NaN |
Edm.Double |
Edm.Int64 |
La constante se convierte a Edm.Double , lo que provoca una pérdida de precisión para los valores de gran magnitud |
Edm.Double |
Edm.Int32 |
N/D |
Edm.Int64 |
Edm.Double |
No se permiten las comparaciones con NaN , -INF o INF |
Edm.Int64 |
Edm.Int64 |
N/D |
Edm.Int64 |
Edm.Int32 |
La constante se convierte a Edm.Int64 antes de la comparación |
Edm.Int32 |
Edm.Double |
No se permiten las comparaciones con NaN , -INF o INF |
Edm.Int32 |
Edm.Int64 |
N/D |
Edm.Int32 |
Edm.Int32 |
N/D |
En el caso de comparaciones que no se permiten, como comparar un campo de tipo Edm.Int64
con NaN
, la API de REST de Azure AI Search devolverá un error "HTTP 400: Solicitud incorrecta".
Importante
Aunque las comparaciones de tipos numéricos son flexibles, se recomienda encarecidamente escribir comparaciones en filtros para que el valor constante sea del mismo tipo de datos que la variable o función con la que se compara. Esto es especialmente importante cuando se mezclan valores enteros y de punto flotante, en los que las conversiones implícitas pueden perder precisión.
Casos especiales para null
y NaN
Al usar los operadores de comparación, es importante recordar que, en Azure Search, todos los campos que no son de colección de Azure AI Search pueden ser null
. En la tabla siguiente se muestran todos los resultados posibles de una expresión de comparación en la que cualquiera de los lados puede ser null
:
Operador | Resultado cuando solo el campo o la variable es null |
Resultado cuando solo la constante es null |
Resultado cuando el campo o la variable y la constante son null |
---|---|---|---|
gt |
false |
Error HTTP 400: Solicitud incorrecta | Error HTTP 400: Solicitud incorrecta |
lt |
false |
Error HTTP 400: Solicitud incorrecta | Error HTTP 400: Solicitud incorrecta |
ge |
false |
Error HTTP 400: Solicitud incorrecta | Error HTTP 400: Solicitud incorrecta |
le |
false |
Error HTTP 400: Solicitud incorrecta | Error HTTP 400: Solicitud incorrecta |
eq |
false |
false |
true |
ne |
true |
true |
false |
En resumen, null
solo es igual a sí mismo, y no es menor o mayor que ningún otro valor.
Si el índice tiene campos de tipo Edm.Double
y carga valores NaN
a esos campos, tendrá que tenerlo en cuenta al escribir filtros. Azure AI Search implementa el estándar IEEE 754 para el control de valores NaN
, y las comparaciones con esos valores generan resultados que no son obvios, como se muestra en la tabla siguiente.
Operador | Resultado cuando al menos un operando es NaN |
---|---|
gt |
false |
lt |
false |
ge |
false |
le |
false |
eq |
false |
ne |
true |
En resumen, NaN
no es igual a ningún valor, incluido él mismo.
Comparación de datos geoespaciales
No se puede comparar directamente un campo de tipo Edm.GeographyPoint
con un valor constante, pero se puede usar la función geo.distance
. Esta función devuelve un valor de tipo Edm.Double
, de modo que puede compararlo con un valor numérico constante para filtrar según la distancia con respecto a coordenadas geoespaciales constantes. Vea los ejemplos siguientes.
Comparación de datos de cadena
En los filtros, las cadenas se pueden comparar para obtener coincidencias exactas con los operadores eq
y ne
. Estas comparaciones distinguen mayúsculas de minúsculas.
Ejemplos
Comparar documentos donde el campo Rating
esté entre 3 y 5, inclusive:
Rating ge 3 and Rating le 5
Comparar documentos donde el campo Location
está a menos de dos kilómetros de la latitud y longitud especificadas:
geo.distance(Location, geography'POINT(-122.031577 47.578581)') lt 2.0
Comparar documentos donde el campo LastRenovationDate
es mayor o igual que el 1 de enero de 2015, medianoche (UTC):
LastRenovationDate ge 2015-01-01T00:00:00.000Z
Comparar documentos donde el campo Details/Sku
no es null
:
Details/Sku ne null
Comparar documentos para hoteles donde al menos una habitación tenga el tipo "Deluxe Room" (Habitación Deluxe), donde la cadena del campo Rooms/Type
coincide exactamente con el filtro:
Rooms/any(room: room/Type eq 'Deluxe Room')