OData-insamlingsoperatorer i Azure AI Search – any
och all
När du skriver ett OData-filteruttryck som ska användas med Azure AI Search är det ofta användbart att filtrera på samlingsfält. Du kan uppnå detta med operatorerna any
och all
.
Syntax
Följande EBNF (Extended Backus-Naur Form) definierar grammatiken för ett OData-uttryck som använder any
eller all
.
collection_filter_expression ::=
field_path'/all(' lambda_expression ')'
| field_path'/any(' lambda_expression ')'
| field_path'/any()'
lambda_expression ::= identifier ':' boolean_expression
Ett interaktivt syntaxdiagram är också tillgängligt:
Kommentar
Se syntaxreferens för OData-uttryck för Azure AI Search för hela EBNF.
Det finns tre uttrycksformer som filtrerar samlingar.
- De första två itererar över ett samlingsfält och tillämpar ett predikat som anges i form av ett lambda-uttryck på varje element i samlingen.
- Ett uttryck som använder
all
returnerartrue
om predikatet är sant för varje element i samlingen. - Ett uttryck som använder
any
returnerartrue
om predikatet är sant för minst ett element i samlingen.
- Ett uttryck som använder
- Den tredje formen av samlingsfilter använder
any
utan ett lambda-uttryck för att testa om ett samlingsfält är tomt. Om samlingen har några element returnerastrue
. Om samlingen är tom returnerarfalse
den .
Ett lambda-uttryck i ett samlingsfilter är som brödtexten i en loop i ett programmeringsspråk. Den definierar en variabel, kallad intervallvariabeln, som innehåller det aktuella elementet i samlingen under iterationen. Den definierar också ett annat booleskt uttryck som är filtervillkoren som ska tillämpas på intervallvariabeln för varje element i samlingen.
Exempel
Matcha dokument vars tags
fält innehåller exakt strängen "wifi":
tags/any(t: t eq 'wifi')
Matcha dokument där varje element i fältet ratings
faller mellan 3 och 5, inklusive:
ratings/all(r: r ge 3 and r le 5)
Matcha dokument där någon av geo-koordinaterna i locations
fältet finns inom den angivna polygonen:
locations/any(loc: geo.intersects(loc, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
Matcha dokument där fältet rooms
är tomt:
not rooms/any()
Matcha dokument där fältet (för alla rum) rooms/amenities
innehåller "tv" och rooms/baseRate
är mindre än 100:
rooms/all(room: room/amenities/any(a: a eq 'tv') and room/baseRate lt 100.0)
Begränsningar
Alla funktioner i filteruttryck är inte tillgängliga i brödtexten i ett lambda-uttryck. Begränsningarna varierar beroende på datatypen för samlingsfältet som du vill filtrera. I följande tabell sammanfattas begränsningarna.
Datatyp | Funktioner som tillåts i lambda-uttryck med any |
Funktioner som tillåts i lambda-uttryck med all |
---|---|---|
Collection(Edm.ComplexType) |
Allt utom search.ismatch och search.ismatchscoring |
Samma |
Collection(Edm.String) |
Jämförelser med eq eller search.in Kombinera underuttryck med or |
Jämförelser med ne eller not search.in() Kombinera underuttryck med and |
Collection(Edm.Boolean) |
Jämförelser med eq eller ne |
Samma |
Collection(Edm.GeographyPoint) |
Använda geo.distance med lt eller le geo.intersects Kombinera underuttryck med or |
Använda geo.distance med gt eller ge not geo.intersects(...) Kombinera underuttryck med and |
Collection(Edm.DateTimeOffset) , Collection(Edm.Double) , , Collection(Edm.Int32) Collection(Edm.Int64) |
Jämförelser med , eq ne , lt , gt , le ellerge Kombinera jämförelser med andra underuttryck med hjälp av or Kombinera jämförelser förutom ne med andra underuttryck med hjälp av and Uttryck med hjälp av kombinationer av and och or i disjunctive Normal Form (DNF) |
Jämförelser med , eq ne , lt , gt , le ellerge Kombinera jämförelser med andra underuttryck med hjälp av and Kombinera jämförelser förutom eq med andra underuttryck med hjälp av or Uttryck som använder kombinationer av and och or i konjunktiv normal form (CNF) |
Mer information om dessa begränsningar och exempel finns i Felsöka samlingsfilter i Azure AI Search. Mer detaljerad information om varför dessa begränsningar finns finns i Förstå samlingsfilter i Azure AI Search.