Opérateurs logiques OData dans Azure AI Recherche - and
, or
, not
Les expressions de filtre OData dans Azure AI Recherche sont des expressions booléennes qui s’évaluent à true
ou false
. Vous pouvez écrire un filtre complexe en rédigeant une série de filtres plus simples et en les composant des opérateurs logiques de l’algèbre booléen :
and
: un opérateur binaire qui s’évalue àtrue
si ses sous-expressions droite et gauche s’évaluent àtrue
.or
: un opérateur binaire qui s’évalue àtrue
si l’une de ses sous-expressions droite ou gauche s’évalue àtrue
.not
: un opérateur unaire qui s’évalue àtrue
si sa sous-expression s’évalue àfalse
, et vice versa.
Ces opérateurs, ainsi que les opérateurs de collectionany
et all
, vous permettent de construire des filtres qui peuvent exprimer des critères de recherche complexes.
Syntaxe
L’extension EBNF suivante (Extended Backus-Naur Form) définit la grammaire d’une expression OData utilisant les opérateurs logiques.
logical_expression ::=
boolean_expression ('and' | 'or') boolean_expression
| 'not' boolean_expression
Un diagramme de syntaxe interactif est également disponible :
Remarque
Consultez Informations de référence sur la syntaxe d’expression OData pour Azure AI Recherche pour avoir le format EBNF complet.
Il s’agit de deux formes d’expressions logiques : binaire (and
/or
), où il y a deux sous-expressions, et unaire (not
), où il n’y en a qu’une. Les sous-expressions peuvent être des expressions booléennes de toutes sortes :
- Champs ou variables de plage de type
Edm.Boolean
- Fonctions qui retournent des valeurs de type
Edm.Boolean
, telles quegeo.intersects
ousearch.ismatch
- Expressions de comparaison, telles que
rating gt 4
- Expressions de collection, telles que
Rooms/any(room: room/Type eq 'Deluxe Room')
- Littéraux booléens
true
oufalse
. - Autres expressions logiques construites à l’aide de
and
,or
etnot
.
Important
Il y a certaines situations où tous les types de sous-expressions peuvent être utilisés avec and
/or
, particulièrement dans des expressions lambda. Consultez Opérateurs de collection OData dans Azure AI Recherche pour en savoir plus.
Opérateurs logiques et null
La plupart des expressions booléennes, telles que les fonctions et les comparaisons, ne peuvent pas produire de valeurs null
, et les opérateurs logiques ne peuvent pas être appliqués au littéral null
directement (par exemple, x and null
n’est pas autorisé). Toutefois, les champs booléens peuvent être null
, vous devez donc être conscient du comportement des opérateurs and
, or
et not
en présence de null. Ceci est résumé dans le tableau suivant, où b
est un champ de type Edm.Boolean
:
Expression | Résultat lorsque b est 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 |
Lorsqu’un champ booléen b
apparaît tout seul dans une expression de filtre, il se comporte comme s’il avait été écrit b eq true
, donc si b
est null
, l’expression s’évalue à false
. De même, not b
se comporte comme not (b eq true)
, donc elle s’évalue à true
. Ainsi, les champs null
se comportent de la même façon que false
. Ceci est cohérent avec la manière dont ils se comportent lorsqu’ils sont combinés à d’autres expressions à l’aide de and
et or
, comme illustré dans le tableau ci-dessus. Malgré ça, une comparaison directe à false
(b eq false
) s’évalue toujours à false
. En d’autres termes, null
n’est pas égal à false
, bien qu’il se comporte comme tel dans les expressions booléennes.
Exemples
Correspondance des documents dans lesquels le champ rating
est compris entre 3 et 5 (inclusif) :
rating ge 3 and rating le 5
Correspondance des documents dans lesquels tous les éléments du champ ratings
sont inférieurs à 3 ou supérieurs à 5 :
ratings/all(r: r lt 3 or r gt 5)
Correspondance des documents dans lesquels le champ location
est compris dans le polygone donné, et que le document ne contient pas le terme « 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')
Correspondance des documents pour les hôtels à Vancouver, au Canada, qui comprennent une chambre de luxe avec un prix de base inférieur à 160 :
Address/City eq 'Vancouver' and Address/Country eq 'Canada' and Rooms/any(room: room/Type eq 'Deluxe Room' and room/BaseRate lt 160)