Compartir a través de


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 como true si las dos subexpresiones a la izquierda y la derecha se evalúan como true.
  • or: un operador binario que se evalúa como true si una de las subexpresiones a la izquierda o la derecha se evalúa como true.
  • not: un operador unario que se evalúa como true si su subexpresión se evalúa como false 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, como geo.intersects o search.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 o false.
  • Otras expresiones lógicas que se construyen con and, or y not.

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)

Pasos siguientes