Opérateurs de collection OData dans la Recherche Azure AI - any
et all
Quand vous écrivez une expression de filtre OData à utiliser avec la Recherche Azure AI, il est souvent utile de filtrer sur les champs de la collection. Vous pouvez y parvenir à l’aide des opérateurs any
et all
.
L’extension EBNF suivante (Extended Backus-Naur Form) définit la grammaire d’une expression OData utilisant any
ou all
.
collection_filter_expression ::=
field_path'/all(' lambda_expression ')'
| field_path'/any(' lambda_expression ')'
| field_path'/any()'
lambda_expression ::= identifier ':' boolean_expression
Un diagramme de syntaxe interactif est également disponible :
Notes
Consultez Informations de référence sur la syntaxe d’expression OData pour la Recherche Azure AI afin d’avoir la forme EBNF complète.
Il existe trois formes d’expression qui filtrent les collections.
- Les deux premiers itèrent sur un champ de collection, en appliquant un prédicat donné sous la forme d’une expression lambda à chaque élément de la collection.
- Une expression qui utilise
all
renvoietrue
si le prédicat a la valeur true pour chaque élément de la collection. - Une expression qui utilise
any
renvoietrue
si le prédicat a la valeur true pour au moins un élément de la collection.
- Une expression qui utilise
- La troisième forme de filtre de collection utilise
any
sans expression lambda pour tester si un champ de la collection est vide. Si la collection comporte des éléments, elle renvoietrue
. Si la collection est vide, elle renvoiefalse
.
Un expression lambda d’un filtre de collection est comme le corps d’une boucle dans un langage de programmation. Elle définit une variable, appelée variable de portée, qui contient l’élément actuel de la collection pendant l’itération. Elle définit également une autre expression booléenne qui est le critère de filtre à appliquer à la variable de portée pour chaque élément de la collection.
Correspondance des documents dont le champ tags
contient exactement la chaîne « wifi » :
tags/any(t: t eq 'wifi')
Correspondance des documents où chaque élément du champ ratings
se situe entre 3 et 5, y compris :
ratings/all(r: r ge 3 and r le 5)
Correspondance des documents où chaque coordonnée géographique du champ locations
se trouve dans le polygone donné :
locations/any(loc: geo.intersects(loc, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
Correspondance des documents dans lesquels le champ rooms
est vide :
not rooms/any()
Recherchez les documents où (pour toutes les salles), le champ rooms/amenities
contient « tv » et rooms/baseRate
est inférieur à 100 :
rooms/all(room: room/amenities/any(a: a eq 'tv') and room/baseRate lt 100.0)
Toutes les fonctionnalités d’expressions de filtre ne sont pas disponibles dans le corps d’une expression lambda. Les restrictions diffèrent selon le type de données du champ de la collection que vous souhaitez filtrer. Le tableau suivant récapitule les restrictions :
Type de données | Fonctionnalités autorisées dans les expressions lambda avec any |
Fonctionnalités autorisées dans les expressions lambda avec all |
---|---|---|
Collection(Edm.ComplexType) |
Tout sauf search.ismatch et search.ismatchscoring |
Identique |
Collection(Edm.String) |
Comparaisons avec eq ou search.in Combinaison de sous-expressions avec or |
Comparaisons avec ne ou not search.in() Combinaison de sous-expressions avec and |
Collection(Edm.Boolean) |
Comparaisons avec eq ou ne |
Identique |
Collection(Edm.GeographyPoint) |
Utilisation de geo.distance avec lt ou le geo.intersects Combinaison de sous-expressions avec or |
Utilisation de geo.distance avec gt ou ge not geo.intersects(...) Combinaison de sous-expressions avec and |
Collection(Edm.DateTimeOffset) , Collection(Edm.Double) , Collection(Edm.Int32) , Collection(Edm.Int64) |
Comparaisons avec eq , ne , lt , gt , le ou ge Combinaison de comparaisons avec d’autres sous-expressions à l’aide de or Combinaison de comparaisons, sauf ne , avec d’autres sous-expressions à l’aide de and Expressions utilisant des combinaisons de and et or en forme normale disjonctive (FND) |
Comparaisons avec eq , ne , lt , gt , le ou ge Combinaison de comparaisons avec d’autres sous-expressions à l’aide de and Combinaison de comparaisons, sauf eq , avec d’autres sous-expressions à l’aide de or Expressions utilisant des combinaisons de and et or en forme normale conjonctive (FNC) |
Pour plus d’informations sur ces limitations et pour obtenir des exemples, consultez Résolution des problèmes de filtres de collection dans la Recherche Azure AI. Pour plus d’informations sur la raison de ces limitations, consultez Présentation des filtres de collection dans la Recherche Azure AI.