OData-verzamelingsoperators in Azure AI Search - any
en all
Wanneer u een OData-filterexpressie schrijft voor gebruik met Azure AI Search, is het vaak handig om te filteren op verzamelingsvelden. U kunt dit bereiken met behulp van de any
en all
operators.
Syntaxis
Het volgende EBNF (Extended Backus-Naur Form) definieert de grammatica van een OData-expressie die gebruikmaakt van any
of all
.
collection_filter_expression ::=
field_path'/all(' lambda_expression ')'
| field_path'/any(' lambda_expression ')'
| field_path'/any()'
lambda_expression ::= identifier ':' 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 drie expressievormen waarmee verzamelingen worden gefilterd.
- De eerste twee herhalen over een verzamelingsveld, waarbij een predicaat in de vorm van een lambda-expressie wordt toegepast op elk element van de verzameling.
- Een expressie die wordt gebruikt
all
, retourneerttrue
als het predicaat waar is voor elk element van de verzameling. - Een expressie die wordt gebruikt
any
, retourneerttrue
als het predicaat waar is voor ten minste één element van de verzameling.
- Een expressie die wordt gebruikt
- De derde vorm van het verzamelingsfilter gebruikt
any
zonder een lambda-expressie om te testen of een verzamelingsveld leeg is. Als de verzameling elementen bevat, wordt deze geretourneerdtrue
. Als de verzameling leeg is, wordt deze geretourneerdfalse
.
Een lambda-expressie in een verzamelingsfilter lijkt op de hoofdtekst van een lus in een programmeertaal. Hiermee definieert u een variabele, de zogenaamde bereikvariabele, die het huidige element van de verzameling bevat tijdens de iteratie. Er wordt ook een andere Booleaanse expressie gedefinieerd die de filtercriteria zijn die moeten worden toegepast op de bereikvariabele voor elk element van de verzameling.
Voorbeelden
Overeenkomen met documenten waarvan tags
het veld exact de tekenreeks "wifi" bevat:
tags/any(t: t eq 'wifi')
Overeenkomen met documenten waarbij elk element van het ratings
veld tussen 3 en 5 valt, inclusief:
ratings/all(r: r ge 3 and r le 5)
Overeenkomen met documenten waarbij een van de geografische coördinaten in het locations
veld zich binnen de opgegeven veelhoek bevindt:
locations/any(loc: geo.intersects(loc, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
Overeenkomen met documenten waarin het rooms
veld leeg is:
not rooms/any()
Overeenkomen met documenten waarbij (voor alle kamers) het rooms/amenities
veld "tv" bevat en rooms/baseRate
kleiner is dan 100:
rooms/all(room: room/amenities/any(a: a eq 'tv') and room/baseRate lt 100.0)
Beperkingen
Niet elke functie van filterexpressies is beschikbaar in de hoofdtekst van een lambda-expressie. De beperkingen verschillen, afhankelijk van het gegevenstype van het verzamelingsveld dat u wilt filteren. De volgende tabel bevat een overzicht van de beperkingen.
Gegevenstype | Functies die zijn toegestaan in lambda-expressies met any |
Functies die zijn toegestaan in lambda-expressies met all |
---|---|---|
Collection(Edm.ComplexType) |
Alles behalve search.ismatch en search.ismatchscoring |
Zelfde |
Collection(Edm.String) |
Vergelijkingen met eq of search.in Subexpressies combineren met or |
Vergelijkingen met ne of not search.in() Subexpressies combineren met and |
Collection(Edm.Boolean) |
Vergelijkingen met eq of ne |
Zelfde |
Collection(Edm.GeographyPoint) |
Gebruiken geo.distance met lt of le geo.intersects Subexpressies combineren met or |
Gebruiken geo.distance met gt of ge not geo.intersects(...) Subexpressies combineren met and |
Collection(Edm.DateTimeOffset) , , , Collection(Edm.Double) Collection(Edm.Int32) Collection(Edm.Int64) |
Vergelijkingen met behulp van eq , ne , lt , , gt , of le ge Vergelijkingen combineren met andere subexpressies met behulp van or Vergelijkingen combineren, behalve ne met andere subexpressies met behulp van and Expressies die combinaties van and en or in Disjunctive Normal Form (DNF) gebruiken |
Vergelijkingen met behulp van eq , ne , lt , , gt , of le ge Vergelijkingen combineren met andere subexpressies met behulp van and Vergelijkingen combineren, behalve eq met andere subexpressies met behulp van or Expressies die combinaties van en or in De Normale Vorm van and Java (CNF) gebruiken |
Zie Verzamelingsfilters oplossen in Azure AI Search voor meer informatie over deze beperkingen en voorbeelden. Zie Informatie over verzamelingsfilters in Azure AI Search voor meer gedetailleerde informatie over waarom deze beperkingen bestaan.