Logische OData-operators in Azure AI Search - and
, or
not
OData-filterexpressies in Azure AI Search zijn Booleaanse expressies die evalueren of false
true
. U kunt een complex filter schrijven door een reeks eenvoudigere filters te schrijven en deze op te stellen met behulp van de logische operatoren uit Booleaanse algebra:
and
: Een binaire operator die evalueerttrue
of zowel de linker- als de rechtersubexpressies worden geëvalueerdtrue
.or
: Een binaire operator die evalueerttrue
of een van de linker- of rechtersubexpressies resulteert intrue
.not
: Een unaire operator die evalueerttrue
of de subexpressie resulteert infalse
en omgekeerd.
Samen met de verzamelingsoperators any
en all
kunt u filters maken die zeer complexe zoekcriteria kunnen uitdrukken.
Syntaxis
Met het volgende EBNF-formulier (Extended Backus-Naur Form) definieert u de grammatica van een OData-expressie die gebruikmaakt van de logische operators.
logical_expression ::=
boolean_expression ('and' | 'or') boolean_expression
| 'not' boolean_expression
Er is ook een interactief syntaxisdiagram beschikbaar:
Notitie
Zie naslaginformatie over de syntaxis van de OData-expressie voor Azure AI Search voor het volledige EBNF.
Er zijn twee vormen van logische expressies: binair (and
/or
), waarbij er twee subexpressies zijn, en unaire (not
), waarbij er slechts één is. De subexpressies kunnen Booleaanse expressies van elk type zijn:
- Velden of bereikvariabelen van het type
Edm.Boolean
- Functies die waarden van het type
Edm.Boolean
retourneren, zoalsgeo.intersects
ofsearch.ismatch
- Vergelijkingsexpressies, zoals
rating gt 4
- Verzamelingexpressies, zoals
Rooms/any(room: room/Type eq 'Deluxe Room')
- De Booleaanse letterlijke waarden
true
offalse
. - Andere logische expressies die zijn samengesteld met behulp van
and
,or
ennot
.
Belangrijk
Er zijn enkele situaties waarin niet alle soorten subexpressie kunnen worden gebruikt met and
/or
, met name binnen lambda-expressies. Zie OData-verzamelingsoperators in Azure AI Search voor meer informatie.
Logische operators en null
De meeste Boole-expressies, zoals functies en vergelijkingen, kunnen geen waarden produceren null
en de logische operatoren kunnen niet rechtstreeks worden toegepast op de null
letterlijke waarde (bijvoorbeeld x and null
niet toegestaan). Booleaanse velden kunnen echter zijn null
, dus u moet zich bewust zijn van hoe de and
, or
en not
operators zich gedragen in de aanwezigheid van null. Dit wordt samengevat in de volgende tabel, waarbij b
een veld van het type Edm.Boolean
is:
Expression | Resultaat wanneer b is 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 |
Wanneer een Booleaanse veld b
op zichzelf wordt weergegeven in een filterexpressie, gedraagt het zich alsof het is geschrevenb eq true
, dus als b
dat het isnull
, wordt de expressie geëvalueerd.false
Op dezelfde manier not b
gedraagt het zich als not (b eq true)
, dus het evalueert naar true
. Op deze manier null
gedragen velden zich hetzelfde als false
. Dit is consistent met hoe ze zich gedragen in combinatie met andere expressies die worden gebruikt and
en or
, zoals wordt weergegeven in de bovenstaande tabel. Ondanks dit zal een directe vergelijking met false
(b eq false
) nog steeds evalueren.false
Met andere woorden, null
is niet gelijk aan false
, ook al gedraagt het zich als het in Boole-expressies.
Voorbeelden
Overeenkomen met documenten waarbij het rating
veld tussen 3 en 5 ligt, inclusief:
rating ge 3 and rating le 5
Overeenkomen met documenten waarbij alle elementen van het ratings
veld kleiner zijn dan 3 of groter dan 5:
ratings/all(r: r lt 3 or r gt 5)
Overeenkomen met documenten waarin het location
veld zich in de opgegeven veelhoek bevindt en het document bevat niet de term 'openbaar'.
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')
Overeenkomen met documenten voor hotels in Vancouver, Canada waar er een deluxe kamer is met een basistarief minder dan 160:
Address/City eq 'Vancouver' and Address/Country eq 'Canada' and Rooms/any(room: room/Type eq 'Deluxe Room' and room/BaseRate lt 160)