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:
Poznámka:
Úplný soubor EBNF najdete v referenčních informacích k syntaxi výrazů OData pro Azure AI Search .
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.
- Výraz, který používá
- 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í hodnotufalse
.
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 , , ne lt , 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 , , ne lt , 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.