Operadores lógicos de OData en Azure AI Search: and
, or
y not
Las expresiones de filtro de OData en Azure AI Search son expresiones booleanas que se evalúan como true
o false
. Puede escribir un filtro complejo si escribe una serie de filtros más sencillos y los combina mediante los operadores lógicos de álgebra booleana:
and
: un operador binario que se evalúa comotrue
si las dos subexpresiones a la izquierda y la derecha se evalúan comotrue
.or
: un operador binario que se evalúa comotrue
si una de las subexpresiones a la izquierda o la derecha se evalúa comotrue
.not
: un operador unario que se evalúa comotrue
si su subexpresión se evalúa comofalse
y viceversa.
Estos operadores, junto con los operadores de colección any
y all
, permiten construir filtros que pueden expresar criterios de búsqueda muy complejos.
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 lógicos.
logical_expression ::=
boolean_expression ('and' | 'or') boolean_expression
| 'not' boolean_expression
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 lógicas: binarias (and
/or
), donde hay dos subexpresiones, y unarias (not
), donde solo hay una. Las subexpresiones pueden ser expresiones booleanas de cualquier tipo:
- Campos o variables de rango de tipo
Edm.Boolean
. - Funciones que devuelven valores de tipo
Edm.Boolean
, comogeo.intersects
osearch.ismatch
. - Expresiones de comparación, como
rating gt 4
. - Expresiones de colección, como
Rooms/any(room: room/Type eq 'Deluxe Room')
. - Los literales booleanos
true
ofalse
. - Otras expresiones lógicas que se construyen con
and
,or
ynot
.
Importante
En algunas situaciones no todos los tipos de subexpresión se pueden usar con and
/or
, especialmente dentro de expresiones lambda. Consulta Operadores de colección de OData en Azure AI Search para obtener más información.
Operadores lógicos y null
La mayoría de las expresiones booleanas, como las funciones y las comparaciones, no pueden generar valores null
, y los operadores lógicos no se pueden aplicar directamente al literal null
(por ejemplo, no se permite x and null
). Pero los campos booleanos pueden ser null
, por lo que debe tener en cuenta cómo se comportan los operadores and
, or
y not
en presencia de NULL. Esto se resume en la tabla siguiente, donde b
es un campo de tipo Edm.Boolean
:
Expresión | Resultado cuando b es 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 |
Cuando un campo booleano b
aparece por sí mismo en una expresión de filtro, se comporta como si se hubiese escrito b eq true
, por lo que si b
es null
, la expresión se evalúa como false
. De forma similar, not b
se comporta como not (b eq true)
, por lo que se evalúa como true
. De esta manera, los campos null
se comportan igual que false
. Esto es coherente con su comportamiento cuando se combinan con otras expresiones mediante and
y or
, como se muestra en la tabla anterior. A pesar de esto, una comparación directa con false
(b eq false
) se seguirá evaluando como false
. En otras palabras, null
no es igual a false
, aunque se comporte como tal en las expresiones booleanas.
Ejemplos
Comparar documentos donde el campo rating
esté entre 3 y 5, inclusive:
rating ge 3 and rating le 5
Comparar documentos donde todos los elementos del campo ratings
sean menores que 3 o mayores que 5:
ratings/all(r: r lt 3 or r gt 5)
Comparar documentos donde el campo location
está dentro del polígono determinado, y el documento no contiene el término "public".
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')
Comparar documentos para hoteles en Vancouver, Canadá donde hay una habitación deluxe con una 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)