Operátory kolekce OData ve službě Azure AI Search – any a all

Při psaní výrazu filtru OData, který se má použít se službou Azure AI Search, je často užitečné filtrovat podle polí kolekce. Toho můžete dosáhnout pomocí any operátorů a all operátorů.

Syntaxe

Následující formulář EBNF (Extended Backus-Naur Form) definuje gramatiku výrazu OData, který používá any nebo all.

collection_filter_expression ::=
    field_path'/all(' lambda_expression ')'
    | field_path'/any(' lambda_expression ')'
    | field_path'/any()'

lambda_expression ::= identifier ':' boolean_expression

K dispozici je také interaktivní diagram syntaxe:

Existují tři formy výrazů, které filtrují kolekce.

  • První dvě iterace nad polem kolekce, která použije predikát zadaný ve formě výrazu lambda pro každý prvek kolekce.
    • Výraz, který používá all , vrátí true , pokud je predikát pravdivý pro každý prvek kolekce.
    • Výraz, který používá any , vrátí true , pokud je predikát pravdivý pro alespoň jeden prvek kolekce.
  • Třetí forma filtru kolekce používá any bez výrazu lambda k otestování, zda je pole kolekce prázdné. Pokud kolekce obsahuje nějaké prvky, vrátí true. Pokud je kolekce prázdná, vrátí hodnotu false.

Výraz lambda ve filtru kolekce je podobný textu smyčky v programovacím jazyce. Definuje proměnnou, která se nazývá proměnná rozsahu, která obsahuje aktuální prvek kolekce během iterace. Definuje také další logický výraz, který je kritériem filtru, který se použije na proměnnou rozsahu pro každý prvek kolekce.

Příklady

Porovná dokumenty, jejichž tags pole obsahuje přesně řetězec "wifi":

tags/any(t: t eq 'wifi')

Porovná dokumenty, ve kterých každý prvek ratings pole spadá mezi 3 a 5 včetně:

ratings/all(r: r ge 3 and r le 5)

Porovná dokumenty, ve kterých se v daném mnohoúhelníku nachází některá z geografických souřadnic v locations poli:

locations/any(loc: geo.intersects(loc, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))

Porovná dokumenty, ve rooms kterých je pole prázdné:

not rooms/any()

Porovná dokumenty, ve kterých (pro všechny místnosti) rooms/amenities pole obsahuje "tv", a rooms/baseRate je menší než 100:

rooms/all(room: room/amenities/any(a: a eq 'tv') and room/baseRate lt 100.0)

Omezení

Ne každá funkce výrazů filtru je k dispozici uvnitř textu výrazu lambda. Omezení se liší v závislosti na datovém typu pole kolekce, které chcete filtrovat. Následující tabulka shrnuje omezení.

Datový typ Funkce povolené ve výrazech lambda s využitím any Funkce povolené ve výrazech lambda s využitím all
Collection(Edm.ComplexType) Vše kromě search.ismatch a search.ismatchscoring Stejné
Collection(Edm.String) Porovnání s eq nebo search.in

Kombinování dílčích výrazů s or
Porovnání s ne nebo not search.in()

Kombinování dílčích výrazů s and
Collection(Edm.Boolean) Porovnání s eq nebo ne Stejné
Collection(Edm.GeographyPoint) Použití s geo.distance lt nebo le

geo.intersects

Kombinování dílčích výrazů s or
Použití s geo.distance gt nebo ge

not geo.intersects(...)

Kombinování dílčích výrazů s and
Collection(Edm.DateTimeOffset), Collection(Edm.Double), , Collection(Edm.Int32)Collection(Edm.Int64) Porovnání pomocí eq, , nelt, gt, , le, neboge

Kombinování porovnání s jinými dílčími výrazy pomocí or

Kombinování porovnání s výjimkou ne jiných dílčích výrazů pomocí and

Výrazy používající kombinace a and or v disjunktivním normálním formátu (DNF)
Porovnání pomocí eq, , nelt, gt, , le, neboge

Kombinování porovnání s jinými dílčími výrazy pomocí and

Kombinování porovnání s výjimkou eq jiných dílčích výrazů pomocí or

Výrazy používající kombinace konjunktivového and or normálního formátu (CNF)

Další podrobnosti o těchto omezeních a příkladech najdete v tématu Řešení potíží s filtry kolekcí ve službě Azure AI Search. Podrobnější informace o tom, proč tato omezení existují, najdete v tématu Vysvětlení filtrů kolekcí ve službě Azure AI Search.

Další kroky