Share via


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.

Syntaxe

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 :

Remarque

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 renvoie true si le prédicat a la valeur true pour chaque élément de la collection.
    • Une expression qui utilise any renvoie true si le prédicat a la valeur true pour au moins un élément de la collection.
  • 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 renvoie true. Si la collection est vide, elle renvoie false.

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.

Exemples

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)

Limites

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.

Étapes suivantes