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
devuelvetrue
si el predicado es true para todos los elementos de la colección. - Una expresión que use
any
devuelvetrue
si el predicado es true al menos para un elemento de la colección.
- Una expresión que use
- 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, devuelvetrue
. Si la colección está vacía, devuelvefalse
.
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.