Dela via


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:

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 returnerar true om predikatet är sant för varje element i samlingen.
    • Ett uttryck som använder any returnerar true om predikatet är sant för minst ett element i samlingen.
  • 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 returneras true. Om samlingen är tom returnerar falseden .

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 , eqne, lt, gt, leellerge

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 , eqne, lt, gt, leellerge

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.

Nästa steg