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:

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 , retourneert true als het predicaat waar is voor elk element van de verzameling.
    • Een expressie die wordt gebruikt any , retourneert true als het predicaat waar is voor ten minste één element van de verzameling.
  • 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 geretourneerd true. Als de verzameling leeg is, wordt deze geretourneerd false.

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 lege

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 lege

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.

Volgende stappen