Problembehandlung von OData-Sammlungsfiltern in Azure KI Search
Um in Azure KI Search nach Sammlungsfeldern zu filtern, können Sie die Operatoren any
und all
zusammen mit Lambdaausdrücken verwenden. Ein Lambdaausdruck ist ein Unterfilter, der auf jedes Element einer Sammlung angewendet wird.
In einem Lambdaausdruck sind nicht alle Funktionen von Filterausdrücken verfügbar. Die jeweils verfügbaren Funktionen hängen vom Datentyp des Sammlungsfelds ab, nach dem Sie filtern möchten. Wenn Sie versuchen, eine Funktion in einem Lambdaausdruck zu verwenden, die in diesem Kontext nicht unterstützt wird, kann dies zu einem Fehler führen. Wenn solche Fehler beim Versuch auftreten, einen komplexen Filter über Sammlungsfelder zu schreiben, kann Ihnen dieser Artikel dabei helfen, das Problem zu beheben.
Häufige Sammlungsfilterfehler
In der folgenden Tabelle werden Fehler aufgeführt, die auftreten können, wenn Sie versuchen, einen Sammlungsfilter auszuführen. Diese Fehler treten auf, wenn Sie eine in einem Lambdaausdruck nicht unterstützte Funktion von Filterausdrücken verwenden. Jede Fehlermeldung enthält eine Anleitung dazu, wie Sie Ihren Filter neu schreiben können, um den Fehler zu vermeiden. Die Tabelle enthält auch einen Link zum relevanten Abschnitt dieses Artikels, der weitere Informationen zur Vermeidung des Fehlers bietet.
Fehlermeldung | Situation | Details |
---|---|---|
Die Funktion ismatch enthält keine Parameter, die an die Bereichsvariable „s“ gebunden sind. In Lambdaausdrücken („any“ oder „all“) werden nur gebundene Feldverweise unterstützt. Sie können jedoch den Filter so ändern, dass sich die Funktion ismatch außerhalb des Lambdaausdrucks befindet, und versuchen Sie es erneut. |
Verwenden von search.ismatch oder search.ismatchscoring in einem Lambdaausdruck |
Regeln für das Filtern komplexer Sammlungen |
Ungültiger Lambdaausdruck. Es wurde ein Test auf Gleichheit oder Ungleichheit gefunden, bei dem das Gegenteil in einem Lambdaausdruck erwartet wurde, der ein Feld vom Typ „Collection(Edm.String)“ durchläuft. Verwenden Sie für „any“ Ausdrücke im Format „x eq y“ oder „search.in(...)“. Verwenden Sie für „all“ Ausdrücke im Format „x ne y“, „not (x eq y)“ oder „not search.in(...)“. | Filtern nach einem Feld vom Typ Collection(Edm.String) |
Regeln für das Filtern von Zeichenfolgensammlungen |
Ungültiger Lambdaausdruck. Es wurde eine nicht unterstützte Form eines komplexen booleschen Ausdrucks gefunden. Verwenden Sie für „any“ Ausdrücke, die „ORs von ANDs“ sind, auch bekannt als disjunktive Normalform. Zum Beispiel: (a and b) or (c and d) , wobei a, b, c und d Vergleichs- oder Gleichheitsunterausdrücke sind. Verwenden Sie für „all“ Ausdrücke, die „ANDs von ORs“ sind, auch bekannt als konjunktive Normalform. Zum Beispiel: (a or b) and (c or d) , wobei a, b, c und d Vergleichs- oder Ungleichheitsunterausdrücke sind. Beispiele für Vergleichsausdrücke: „x gt 5“, „x le 2“. Beispiel für einen Gleichheitsausdruck: „x eq 5“. Beispiel für einen Ungleichheitsausdruck: „x ne 5“. |
Filtern nach Feldern vom Typ Collection(Edm.DateTimeOffset) , Collection(Edm.Double) , Collection(Edm.Int32) oder Collection(Edm.Int64) |
Regeln für das Filtern vergleichbarer Sammlungen |
Ungültiger Lambdaausdruck. Es wurde eine nicht unterstützte Verwendung von „geo.distance()“ oder „geo.intersects()“ in einem Lambdaausdruck gefunden, der ein Feld vom Typ „Collection(Edm.GeographyPoint)“ durchläuft. Stellen Sie für „any“ sicher, dass Sie „geo.distance()“ mit dem Operator „lt“ oder „le“ vergleichen und die Verwendung von „geo.intersects()“ nicht negiert wird. Stellen Sie für „all“ sicher, dass Sie „geo.distance()“ mit dem Operator „gt“ oder „ge“ vergleichen und die Verwendung von „geo.intersects()“ negiert wird. | Filtern nach einem Feld vom Typ Collection(Edm.GeographyPoint) |
Regeln für das Filtern von GeographyPoint-Sammlungen |
Ungültiger Lambdaausdruck. Komplexe boolesche Ausdrücke werden in Lambdaausdrücken, die Felder vom Typ „Collection(Edm.GeographyPoint)“ durchlaufen, nicht unterstützt. Die Verknüpfung von „any“ Unterausdrücken mit „or“; „and“ wird nicht unterstützt. Die Verknüpfung von „all“ Unterausdrücken mit „and“; „or“ wird nicht unterstützt. | Filtern nach Feldern vom Typ Collection(Edm.String) oder Collection(Edm.GeographyPoint) |
Regeln für das Filtern von Zeichenfolgensammlungen Regeln für das Filtern von GeographyPoint-Sammlungen |
Ungültiger Lambdaausdruck. Es wurde ein Vergleichsoperator gefunden („lt“, „le“, „gt“ oder „ge“). Es sind nur Gleichheitsoperatoren in Lambdaausdrücken zulässig, die Felder vom Typ „Collection(Edm.String)“ durchlaufen. Verwenden Sie für „any“ Ausdrücke im Format „x eq y“. Verwenden Sie für „all“ Ausdrücke im Format „x ne y“ oder „not (x eq y)“. | Filtern nach einem Feld vom Typ Collection(Edm.String) |
Regeln für das Filtern von Zeichenfolgensammlungen |
Schreiben gültiger Sammlungsfilter
Die Regeln für das Schreiben gültiger Sammlungsfilter sind für jeden Datentyp unterschiedlich. In den folgenden Abschnitten werden die Regeln beschrieben, indem anhand von Beispielen aufgezeigt wird, welche Filterfunktionen unterstützt werden und welche nicht:
- Regeln für das Filtern von Zeichenfolgensammlungen
- Regeln für das Filtern boolescher Sammlungen
- Regeln für das Filtern von GeographyPoint-Sammlungen
- Regeln für das Filtern vergleichbarer Sammlungen
- Regeln für das Filtern komplexer Sammlungen
Regeln für das Filtern von Zeichenfolgensammlungen
In Lambdaausdrücken für Zeichenfolgensammlungen können nur die Vergleichsoperatoren eq
und ne
verwendet werden.
Hinweis
Die Operatoren lt
/le
/gt
/ge
für Zeichenfolgen werden von Azure KI Search nicht unterstützt, weder innerhalb noch außerhalb eines Lambdaausdrucks.
Der Textkörper eines any
kann nur auf Gleichheit überprüfen, während der Textkörper eines all
nur auf Ungleichheit überprüfen kann.
Es ist auch möglich, mehrere Ausdrücke über or
im Textkörper eines any
und über and
im Textkörper eines all
zu kombinieren. Da die Funktion search.in
dem Kombinieren von Gleichheitsüberprüfungen mit or
entspricht, ist sie auch im Textkörper eines any
zulässig. Entsprechend ist not search.in
im Textkörper eines all
zulässig.
Beispielsweise sind die folgenden Ausdrücke zulässig:
tags/any(t: t eq 'books')
tags/any(t: search.in(t, 'books, games, toys'))
tags/all(t: t ne 'books')
tags/all(t: not (t eq 'books'))
tags/all(t: not search.in(t, 'books, games, toys'))
tags/any(t: t eq 'books' or t eq 'games')
tags/all(t: t ne 'books' and not (t eq 'games'))
Dagegen sind die folgenden Ausdrücke unzulässig:
tags/any(t: t ne 'books')
tags/any(t: not search.in(t, 'books, games, toys'))
tags/all(t: t eq 'books')
tags/all(t: search.in(t, 'books, games, toys'))
tags/any(t: t eq 'books' and t ne 'games')
tags/all(t: t ne 'books' or not (t eq 'games'))
Regeln für das Filtern boolescher Sammlungen
Der Typ Edm.Boolean
unterstützt nur die Operatoren eq
und ne
. Daher ist es nicht sinnvoll, die Kombination von Klauseln zuzulassen, die die gleiche Bereichsvariable mit and
/or
überprüfen, da dies immer zu Tautologien oder Widersprüchen führen würde.
Nachfolgend finden Sie einige Beispiele für zulässige Filter für boolesche Sammlungen:
flags/any(f: f)
flags/all(f: f)
flags/any(f: f eq true)
flags/any(f: f ne true)
flags/all(f: not f)
flags/all(f: not (f eq true))
Im Gegensatz zu Zeichenfolgensammlungen gelten für boolesche Sammlungen keine Einschränkungen, welcher Operator in welchem Typ von Lambdaausdruck verwendet werden kann. eq
und ne
können im Textkörper von any
oder all
verwendet werden.
Die folgenden Ausdrücke sind beispielsweise für boolesche Sammlungen unzulässig:
flags/any(f: f or not f)
flags/any(f: f or f)
flags/all(f: f and not f)
flags/all(f: f and f eq true)
Regeln für das Filtern von GeographyPoint-Sammlungen
In einer Sammlung enthaltene Werte vom Typ Edm.GeographyPoint
können nicht direkt miteinander verglichen werden. Sie müssen stattdessen als Parameter für die Funktionen geo.distance
und geo.intersects
verwendet werden. Die Funktion geo.distance
muss wiederum mit einem Abstandswert mit einem Vergleichsoperator (lt
, le
, gt
oder ge
) verglichen werden. Diese Regeln gelten auch für Nicht-Sammlungsfelder vom Typ „Edm.GeographyPoint“.
Wie für Zeichenfolgensammlungen gelten auch für Edm.GeographyPoint
-Sammlungen einige Regeln für die Verwendung und Kombination von Geofunktionen in den verschiedenen Typen von Lambdaausdrücken:
- Welche Vergleichsoperatoren Sie mit der Funktion
geo.distance
verwenden können, hängt vom Typ des Lambdaausdrucks ab. Fürany
können Sie nurlt
oderle
verwenden. Fürall
können Sie nurgt
oderge
verwenden. Sie können Ausdrücke in Verbindung mitgeo.distance
negieren, aber Sie müssen den Vergleichsoperator ändern (geo.distance(...) lt x
wird zunot (geo.distance(...) ge x)
undgeo.distance(...) le x
zunot (geo.distance(...) gt x)
). - Im Textkörper eines
all
muss die Funktiongeo.intersects
negiert werden. Im Textkörper einesany
darf die Funktiongeo.intersects
dagegen nicht negiert werden. - Im Textkörper eines
any
können Geoausdrücke mitor
kombiniert werden. Im Textkörper einesall
können diese Ausdrücke mitand
kombiniert werden.
Die oben genannten Einschränkungen bestehen aus ähnlichen Gründen wie die für Zeichenfolgensammlungen geltenden Einschränkungen in Bezug auf Gleichheit/Ungleichheit. Unter Grundlegendes zu OData-Sammlungsfiltern in Azure KI Search werden diese Gründe genauer erläutert.
Nachfolgend finden Sie einige Beispiele für zulässige Filter für Edm.GeographyPoint
-Sammlungen:
locations/any(l: geo.distance(l, geography'POINT(-122 49)') lt 10)
locations/any(l: not (geo.distance(l, geography'POINT(-122 49)') ge 10) or geo.intersects(l, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
locations/all(l: geo.distance(l, geography'POINT(-122 49)') ge 10 and not geo.intersects(l, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
Die folgenden Ausdrücke sind beispielsweise für Edm.GeographyPoint
-Sammlungen unzulässig:
locations/any(l: l eq geography'POINT(-122 49)')
locations/any(l: not geo.intersects(l, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
locations/all(l: geo.intersects(l, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
locations/any(l: geo.distance(l, geography'POINT(-122 49)') gt 10)
locations/all(l: geo.distance(l, geography'POINT(-122 49)') lt 10)
locations/any(l: geo.distance(l, geography'POINT(-122 49)') lt 10 and geo.intersects(l, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
locations/all(l: geo.distance(l, geography'POINT(-122 49)') le 10 or not geo.intersects(l, geography'POLYGON((-122.031577 47.578581, -122.031577 47.678581, -122.131577 47.678581, -122.031577 47.578581))'))
Regeln für das Filtern vergleichbarer Sammlungen
Dieser Abschnitt gilt für alle folgenden Datentypen:
Collection(Edm.DateTimeOffset)
Collection(Edm.Double)
Collection(Edm.Int32)
Collection(Edm.Int64)
Typen wie Edm.Int32
und Edm.DateTimeOffset
unterstützen alle sechs Vergleichsoperatoren: eq
, ne
, lt
, le
, gt
und ge
. Lambdaausdrücke über Sammlungen dieser Typen können einfache Ausdrücke mit einem dieser Operatoren enthalten. Dies gilt für any
und all
. Beispielsweise sind die folgenden Filter zulässig:
ratings/any(r: r ne 5)
dates/any(d: d gt 2017-08-24T00:00:00Z)
not margins/all(m: m eq 3.5)
Es gibt jedoch Einschränkungen in Bezug darauf, wie solche Vergleichsausdrücke zu komplexeren Ausdrücken in einem Lambdaausdruck kombiniert werden können:
- Regeln für
any
:Einfache Ungleichheitsausdrücke können nicht sinnvoll mit anderen Ausdrücken kombiniert werden. Beispielsweise ist der folgende Ausdruck zulässig:
ratings/any(r: r ne 5)
Der folgende Ausdruck ist jedoch nicht zulässig:
ratings/any(r: r ne 5 and r gt 2)
Und der folgende Ausdruck ist zwar zulässig, aber nicht sinnvoll, weil sich die Bedingungen überschneiden:
ratings/any(r: r ne 5 or r gt 7)
Einfache Vergleichsausdrücke in Verbindung mit
eq
,lt
,le
,gt
oderge
können mitand
/or
kombiniert werden. Beispiel:ratings/any(r: r gt 2 and r le 5)
ratings/any(r: r le 5 or r gt 7)
Mit
and
(Konjunktionen) kombinierte Vergleichsausdrücke können mitor
weiter kombiniert werden. Diese Form wird in boolescher Logik als „disjunktive Normalform“ (DNF) bezeichnet. Beispiel:ratings/any(r: (r gt 2 and r le 5) or (r gt 7 and r lt 10))
- Regeln für
all
:Einfache Gleichheitsausdrücke können nicht sinnvoll mit anderen Ausdrücken kombiniert werden. Beispielsweise ist der folgende Ausdruck zulässig:
ratings/all(r: r eq 5)
Der folgende Ausdruck ist jedoch nicht zulässig:
ratings/all(r: r eq 5 or r le 2)
Und der folgende Ausdruck ist zwar zulässig, aber nicht sinnvoll, weil sich die Bedingungen überschneiden:
ratings/all(r: r eq 5 and r le 7)
Einfache Vergleichsausdrücke in Verbindung mit
ne
,lt
,le
,gt
oderge
können mitand
/or
kombiniert werden. Beispiel:ratings/all(r: r gt 2 and r le 5)
ratings/all(r: r le 5 or r gt 7)
Mit
or
(Disjunktionen) kombinierte Vergleichsausdrücke können mitand
weiter kombiniert werden. Diese Form wird in boolescher Logik als „konjunktive Normalform“ (KNF) bezeichnet. Beispiel:ratings/all(r: (r le 2 or gt 5) and (r lt 7 or r ge 10))
Regeln für das Filtern komplexer Sammlungen
Lambdaausdrücke über komplexe Sammlungen unterstützen eine viel flexiblere Syntax als Lambdaausdrücke über Sammlungen einfacher Typen. Sie können jedes Filterkonstrukt innerhalb eines Lambdaausdrucks verwenden, das Sie außerhalb eines solchen verwenden können, mit nur zwei Ausnahmen.
Erstens: Die Funktionen search.ismatch
und search.ismatchscoring
werden in Lambdaausdrücken nicht unterstützt. Weitere Informationen finden Sie unter Grundlegendes zu OData-Sammlungsfiltern in Azure KI Search.
Zweitens: Das Verweisen auf Felder, die NICHT an die Bereichsvariable gebunden sind (so genannte freie Variablen), ist unzulässig. Betrachten Sie beispielsweise die folgenden zwei äquivalenten OData-Filterausdrücke:
stores/any(s: s/amenities/any(a: a eq 'parking')) and details/margin gt 0.5
stores/any(s: s/amenities/any(a: a eq 'parking' and details/margin gt 0.5))
Der erste Ausdruck ist zulässig, während die zweite Form abgelehnt wird, weil details/margin
nicht an die Bereichsvariable s
gebunden ist.
Diese Regel gilt auch für Ausdrücke mit Variablen, die in einem äußeren Bereich gebunden sind. Diese Variablen sind frei in Bezug auf den Bereich, in dem sie angezeigt werden. So ist im folgenden Beispiel der erste Ausdruck zulässig, während der zweite äquivalente Ausdruck nicht zulässig ist, weil s/name
in Bezug auf den Bereich der Bereichsvariable a
frei ist:
stores/any(s: s/amenities/any(a: a eq 'parking') and s/name ne 'Flagship')
stores/any(s: s/amenities/any(a: a eq 'parking' and s/name ne 'Flagship'))
Diese Einschränkung sollte in der Praxis kein Problem darstellen, weil immer die Möglichkeit besteht, Filter so zu konstruieren, dass Lambdaausdrücke nur gebundene Variablen enthalten.
Kurzübersicht für Sammlungsfilterregeln
In der folgenden Tabelle werden die Regeln für das Konstruieren gültiger Filter für jeden Sammlungsdatentyp 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) |
Beispiele für das Konstruieren gültiger Filter für jeden Anwendungsfall finden Sie unter Schreiben gültiger Sammlungsfilter.
Wenn Sie häufig Filter schreiben und das Verstehen der Regeln der ersten Prinzipien Ihnen mehr helfen würde, als sie nur auswendig zu lernen, lesen Sie Grundlegendes zu OData-Sammlungsfiltern in Azure KI Search.