Operadores de colección de OData en Azure AI Search: any y all

Al escribir una expresión de filtro de OData para usarla con Azure AI Search, a menudo es útil filtrar por campos de colección. Esto se puede conseguir con los operadores any y all.

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 usa any o all.

collection_filter_expression ::=
    field_path'/all(' lambda_expression ')'
    | field_path'/any(' lambda_expression ')'
    | field_path'/any()'

lambda_expression ::= identifier ':' 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 tres formas de expresión que filtran las colecciones.

  • Las dos primeras recorren en iteración un campo de colección y aplican un predicado con forma de expresión lambda a cada elemento de la colección.
    • Una expresión que use all devuelve true si el predicado es true para todos los elementos de la colección.
    • Una expresión que use any devuelve true si el predicado es true al menos para un elemento de la colección.
  • En la tercera forma de filtro de colección se usa any sin una expresión lambda para comprobar si un campo de la colección está vacío. Si la colección tiene algún elemento, devuelve true. Si la colección está vacía, devuelve false.

Una expresión lambda en un filtro de colección es como el cuerpo de un bucle en un lenguaje de programación. Define una variable, denominada variable de rango, que contiene el elemento actual de la colección durante la iteración. También define otra expresión booleana que son los criterios de filtro que se van a aplicar a la variable de rango para cada elemento de la colección.

Ejemplos

Comparar documentos cuyo campo tags contenga exactamente la cadena "wifi":

tags/any(t: t eq 'wifi')

Comparar documentos donde todos los elementos del campo ratings estén comprendidos entre 3 y 5, inclusive:

ratings/all(r: r ge 3 and r le 5)

Comparar documentos donde cualquiera de las geocoordenadas del campo locations esté dentro del polígono indicado:

locations/any(loc: geo.intersects(loc, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))

Comparar documentos donde el campo rooms está vacío:

not rooms/any()

Comparar documentos donde (para todas las habitaciones) el campo rooms/amenities contiene "tv" y rooms/baseRate es inferior a 100:

rooms/all(room: room/amenities/any(a: a eq 'tv') and room/baseRate lt 100.0)

Limitaciones

No todas las características de las expresiones de filtro están disponibles dentro del cuerpo de una expresión lambda. Las limitaciones varían según el tipo de datos del campo de colección que se quiere filtrar. En la tabla siguiente se resumen las limitaciones.

Tipo de datos Características que se permiten en expresiones lambda con any Características que se permiten en expresiones lambda con all
Collection(Edm.ComplexType) Todo excepto search.ismatch y search.ismatchscoring Iguales
Collection(Edm.String) Comparaciones con eq o search.in

Combinación de las subexpresiones con or
Comparaciones con ne o not search.in()

Combinación de las subexpresiones con and
Collection(Edm.Boolean) Comparaciones con eq o ne Iguales
Collection(Edm.GeographyPoint) Uso de geo.distance con lt o le

geo.intersects

Combinación de las subexpresiones con or
Uso de geo.distance con gt o ge

not geo.intersects(...)

Combinación de las subexpresiones con and
Collection(Edm.DateTimeOffset), Collection(Edm.Double), Collection(Edm.Int32), Collection(Edm.Int64) Comparaciones mediante eq, ne, lt, gt, le o ge

Combinación de las comparaciones con otras subexpresiones mediante or

Combinación de las comparaciones, excepto ne con otras subexpresiones mediante and

Expresiones que utilizan combinaciones de and y or en el formulario normal disyuntivo (DNF)
Comparaciones mediante eq, ne, lt, gt, le o ge

Combinación de las comparaciones con otras subexpresiones mediante and

Combinación de las comparaciones, excepto eq con otras subexpresiones mediante or

Expresiones que utilizan combinaciones de and y or en el formulario normal conjuntivo (CNF)

Para obtener más detalles sobre estas limitaciones, así como ejemplos, vea Solución de problemas de los filtros de colección en Azure AI Search. Para obtener información más detallada sobre por qué existen estas limitaciones, vea Descripción de los filtros de colección en Azure AI Search.

Pasos siguientes