Teilen über


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, gibt true zurück, wenn das Prädikat für jedes Element der Sammlung TRUE ist.
    • Ein Ausdruck, der any verwendet, gibt true zurück, wenn das Prädikat für mindestens ein Element der Sammlung TRUE ist.
  • 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, wird true zurückgegeben. Wenn die Sammlung leer ist, wird false 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.

Nächste Schritte