OData-Sammlungsoperatoren in Azure KI Search – any
und all
Beim Schreiben eines OData-Filterausdrucks, der mit Azure KI Search verwendet werden soll, ist es oft hilfreich, nach Sammlungsfeldern zu filtern. Dies können dies mit den Operatoren any
und all
erreichen.
Syntax
Die folgende EBNF (Erweiterte Backus-Naur-Form) definiert die Grammatik eines OData-Ausdrucks, der any
oder all
verwendet.
collection_filter_expression ::=
field_path'/all(' lambda_expression ')'
| field_path'/any(' lambda_expression ')'
| field_path'/any()'
lambda_expression ::= identifier ':' boolean_expression
Ein interaktives Syntaxdiagramm ist ebenfalls verfügbar:
Hinweis
Die vollständige EBNF finden Sie in der Referenz zur OData-Ausdruckssyntax für Azure KI Search.
Es gibt drei Formen von Ausdrücken, die Sammlungen filtern.
- Die ersten beiden iterieren über ein Sammlungsfeld und wenden ein Prädikat in Form eines Lambdaausdrucks auf jedes Element der Sammlung an.
- Ein Ausdruck, der
all
verwendet, gibttrue
zurück, wenn das Prädikat für jedes Element der Sammlung TRUE ist. - Ein Ausdruck, der
any
verwendet, gibttrue
zurück, wenn das Prädikat für mindestens ein Element der Sammlung TRUE ist.
- Ein Ausdruck, der
- Die dritte Form von Sammlungsfilter verwendet
any
ohne einen Lambdaausdruck, um zu testen, ob ein Sammlungsfeld leer ist. Wenn die Sammlung über Elemente verfügt, wirdtrue
zurückgegeben. Wenn die Sammlung leer ist, wirdfalse
zurückgegeben.
Ein Lambdaausdruck in einem Sammlungsfilter ist wie der Textkörper einer Schleife in einer Programmiersprache. Er definiert eine Variable, die als Bereichsvariable bezeichnet wird und das aktuelle Element der Sammlung während der Iteration enthält. Er definiert auch einen weiteren booleschen Ausdruck, der die Filterkriterien darstellt, die auf die Bereichsvariable für jedes Element der Sammlung angewendet werden sollen.
Beispiele
Abgleichen von Dokumenten, deren tags
-Feld die genaue Zeichenfolge „wifi“ enthält:
tags/any(t: t eq 'wifi')
Abgleichen von Dokumenten, in denen jedes Element des ratings
-Felds zwischen 3 und 5 (einschließlich) liegt:
ratings/all(r: r ge 3 and r le 5)
Abgleichen von Dokumenten, in denen jede der Geokoordinaten im locations
-Feld im angegebenen Polygon liegt:
locations/any(loc: geo.intersects(loc, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
Abgleichen von Dokumenten, bei denen das rooms
-Feld leer ist:
not rooms/any()
Abgleichen von Dokumenten, in denen das rooms/amenities
-Feld für alle Räume „tv“ enthält und rooms/baseRate
kleiner als 100 ist:
rooms/all(room: room/amenities/any(a: a eq 'tv') and room/baseRate lt 100.0)
Begrenzungen
Nicht jedes Merkmal von Filterausdrücken ist innerhalb des Textkörpers eines Lambdaausdrucks verfügbar. Die unterschiedlichen Einschränkungen hängen vom Datentyp des Sammlungsfelds ab, nach dem Sie filtern möchten. Die Einschränkungen werden in der folgenden Tabelle zusammengefasst.
Datentyp | Features, die in Lambdaausdrücken mit any zulässig sind |
Features, die in Lambdaausdrücken mit all zulässig sind |
---|---|---|
Collection(Edm.ComplexType) |
Alles mit Ausnahme von search.ismatch und search.ismatchscoring |
identisch |
Collection(Edm.String) |
Vergleiche mit eq oder search.in Kombinieren von Unterausdrücken mit or |
Vergleiche mit ne oder not search.in() Kombinieren von Unterausdrücken mit and |
Collection(Edm.Boolean) |
Vergleiche mit eq oder ne |
identisch |
Collection(Edm.GeographyPoint) |
Verwenden von geo.distance mit lt oder le geo.intersects Kombinieren von Unterausdrücken mit or |
Verwenden von geo.distance mit gt oder ge not geo.intersects(...) Kombinieren von Unterausdrücken mit and |
Collection(Edm.DateTimeOffset) , Collection(Edm.Double) , Collection(Edm.Int32) , Collection(Edm.Int64) |
Vergleiche mit eq , ne , lt , gt , le oder ge Kombinieren von Vergleichen mit anderen Unterausdrücken über or Kombinieren von Vergleichen, ausgenommen ne , mit anderen Unterausdrücken über and Ausdrücke über Kombinationen von and und or in disjunktiver Normalform (DNF) |
Vergleiche mit eq , ne , lt , gt , le oder ge Kombinieren von Vergleichen mit anderen Unterausdrücken über and Kombinieren von Vergleichen, ausgenommen eq , mit anderen Unterausdrücken über or Ausdrücke über Kombinationen von and und or in konjunktiver Normalform (KNF) |
Weitere Informationen zu diesen Einschränkungen sowie Beispiele finden Sie unter Problembehandlung von Sammlungsfiltern in Azure KI Search. Ausführlichere Informationen dazu, warum diese Einschränkungen vorhanden sind, finden Sie unter Grundlegendes zu Sammlungsfiltern in Azure KI Search.