OData-gyűjteményszűrők hibaelhárítása az Azure AI Searchben
Az Azure AI Search gyűjteménymezőire való szűréshez használhatja az operátorokat és all
a any
lambda kifejezéseket. A lambda kifejezés egy olyan alszűrő, amelyet a rendszer a gyűjtemény minden elemére alkalmaz.
A szűrőkifejezések nem minden funkciója érhető el a lambda kifejezésben. Az elérhető funkciók a szűrni kívánt gyűjteménymező adattípusától függően eltérőek. Ez hibát okozhat, ha olyan szolgáltatást próbál használni egy lambda kifejezésben, amely ebben a környezetben nem támogatott. Ha ilyen hibákba ütközik, amikor összetett szűrőt próbál írni a gyűjteménymezőkre, ez a cikk segít a probléma elhárításában.
Gyakori gyűjteményszűrő-hibák
Az alábbi táblázat felsorolja azokat a hibákat, amelyeket a gyűjteményszűrők végrehajtásakor tapasztalhat. Ezek a hibák akkor fordulnak elő, ha olyan szűrőkifejezéseket használ, amelyek nem támogatottak a lambda kifejezésben. Minden hiba útmutatást ad a szűrő újraírásához a hiba elkerülése érdekében. A táblázat a cikk megfelelő szakaszára mutató hivatkozást is tartalmaz, amely további információt nyújt a hiba elkerüléséről.
Hibaüzenet | Helyzet | Részletek |
---|---|---|
A függvény ismatch nem rendelkezik az 's' tartományváltozóhoz kötött paraméterekkel. Csak a kötött mezőhivatkozások támogatottak a Lambda-kifejezésekben ('any' vagy 'all'). Módosíthatja azonban a szűrőt, hogy a ismatch függvény a lambda kifejezésen kívül legyen, és próbálkozzon újra. |
Lambda-kifejezés használata search.ismatch vagy search.ismatchscoring azon belül |
Az összetett gyűjtemények szűrésének szabályai |
Érvénytelen lambda kifejezés. Olyan egyenlőségi vagy egyenlőtlenségi tesztet talált, amelyben az ellenkezője várt egy Lambda-kifejezésben, amely a Collection(Edm.String) típusú mezőn iterál. Az "any" kifejezéshez használja az "x eq y" vagy a "search.in(...)" űrlap kifejezéseit. Az "all" kifejezésnél használja az "x ne y", a "not (x eq y)" vagy a "not search.in(...)" űrlap kifejezéseit. | Szűrés egy típusmezőn Collection(Edm.String) |
Sztringgyűjtemények szűrésének szabályai |
Érvénytelen lambda kifejezés. Összetett logikai kifejezés nem támogatott formáját észlelte. Az "any" kifejezésnél használja az "AND-k ORs-eit", más néven disjunctive Normal Form(ak) kifejezéseket. Például: (a and b) or (c and d) ahol az a, b, c és d összehasonlítási vagy egyenlőségi alexpressziók. Az "összes" kifejezéshez használja az "ORS AND-jei" kifejezést, más néven conjunctive Normal Formot. Például: (a or b) and (c or d) ahol az a, b, c és d összehasonlítási vagy egyenlőtlenségi alexpressziók. Példák összehasonlító kifejezésekre: "x gt 5", "x le 2". Példa egyenlőségi kifejezésre: "x eq 5". Példa egy egyenlőtlenségi kifejezésre: "x ne 5". |
Szűrés típusmezőkönCollection(Edm.DateTimeOffset) , Collection(Edm.Double) vagy Collection(Edm.Int32) Collection(Edm.Int64) |
Az összehasonlítható gyűjtemények szűrésének szabályai |
Érvénytelen lambda kifejezés. A geo.distance() vagy a geo.intersects() nem támogatott használatát találta egy lambda kifejezésben, amely a Collection (Edm.GeographyPoint) típusú mezőn halad át. Az "any" esetében győződjön meg arról, hogy összehasonlítja a geo.distance() függvényt az "lt" vagy a "le" operátor használatával, és győződjön meg arról, hogy a geo.intersects() használata nincs negagálva. Az "összes" esetében győződjön meg arról, hogy összehasonlítja a geo.distance() függvényt a "gt" vagy a "ge" operátorok használatával, és győződjön meg arról, hogy a geo.intersects() bármely használata negagálva van. | Szűrés egy típusmezőn Collection(Edm.GeographyPoint) |
A GeographyPoint-gyűjtemények szűrésének szabályai |
Érvénytelen lambda kifejezés. Az összetett logikai kifejezések nem támogatottak a Lambda-kifejezésekben, amelyek a Collection(Edm.GeographyPoint) típusú mezőkön iterálnak. Az "any" esetében csatlakozzon az "vagy" alkifejezésekhez; 'és' nem támogatott. Az "összes" esetében csatlakozzon az "és" részexpressziókhoz; Az "or" nem támogatott. | Szűrés típus- Collection(Edm.String) vagy Collection(Edm.GeographyPoint) |
Sztringgyűjtemények szűrésének szabályai A GeographyPoint-gyűjtemények szűrésének szabályai |
Érvénytelen lambda kifejezés. Összehasonlító operátort (az "lt", a "le", a "gt" vagy a "ge" egyikét) talált. Csak egyenlőségi operátorok engedélyezettek a Lambda-kifejezésekben, amelyek a Collection(Edm.String) típusú mezőket iterálják. Az "any" esetében az "x eq y" űrlap se kifejezései. Az "összes" esetében használja az "x ne y" vagy a "not (x eq y)" form kifejezéseit. | Szűrés egy típusmezőn Collection(Edm.String) |
Sztringgyűjtemények szűrésének szabályai |
Érvényes gyűjteményszűrők írása
Az érvényes gyűjteményszűrők írására vonatkozó szabályok minden adattípus esetében eltérőek. A következő szakaszok olyan példákat mutatnak be a szabályokra, amelyek a támogatott szűrőfunkciókat támogatják, és amelyek nem:
- Sztringgyűjtemények szűrésének szabályai
- Logikai gyűjtemények szűrésének szabályai
- A GeographyPoint-gyűjtemények szűrésének szabályai
- Az összehasonlítható gyűjtemények szűrésének szabályai
- Az összetett gyűjtemények szűrésének szabályai
Sztringgyűjtemények szűrésének szabályai
A sztringgyűjtemények Lambda-kifejezései között az egyetlen használható összehasonlító operátor az eq
és ne
a .
Feljegyzés
Az Azure AI Search nem támogatja a lt
gt
ge
/le
//sztringek operátorait, akár egy lambda kifejezésen belül, akár azon kívül.
Egy test any
csak az egyenlőséget tesztelheti, míg a teste all
csak az egyenlőtlenséget tesztelheti.
Több kifejezést or
is kombinálhat egy , a törzsben any
és a törzsben all
keresztüland
. Mivel a search.in
függvény egyenértékű az egyenlőségi ellenőrzések or
kombinálásával, a függvény egy .any
Ezzel szemben egy not search.in
all
.
Ezek a kifejezések például engedélyezettek:
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'))
Bár ezek a kifejezések nem engedélyezettek:
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'))
Logikai gyűjtemények szűrésének szabályai
A típus Edm.Boolean
csak az és ne
az eq
operátorokat támogatja. Ezért nem érdemes olyan záradékokat kombinálni, amelyek ugyanazt a tartományváltozót and
/or
ellenőrzik, mivel ez mindig tautológiákhoz vagy ellentmondásokhoz vezetne.
Íme néhány példa az engedélyezett logikai gyűjtemények szűrőire:
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))
A sztringgyűjteményekkel ellentétben a logikai gyűjtemények nem korlátozzák, hogy melyik operátor milyen típusú lambdakifejezésben használható. Mindkettő eq
, és ne
használható a törzsében any
vagy all
.
Logikai gyűjteményekben nem engedélyezettek az olyan kifejezések, mint a következők:
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)
A GeographyPoint-gyűjtemények szűrésének szabályai
A gyűjtemények típusértékei Edm.GeographyPoint
nem hasonlíthatók össze közvetlenül egymással. Ehelyett a függvények és geo.intersects
a geo.distance
függvények paramétereként kell használni őket. A geo.distance
függvényt egy távolságértékkel kell összehasonlítani az összehasonlító operátorok lt
egyikével , le
gt
vagy ge
. Ezek a szabályok a nemcollection Edm.GeographyPoint mezőkre is érvényesek.
A sztringgyűjteményekhez Edm.GeographyPoint
hasonlóan a gyűjtemények is rendelkeznek bizonyos szabályokkal a térbeli függvények használatához és kombinálásához a lambdakifejezések különböző típusaiban:
- A függvényhez
geo.distance
használható összehasonlító operátorok a lambda kifejezés típusától függenek. Ehhezany
csak vagyle
.lt
Ehhezall
csak vagyge
.gt
A kifejezéseketgeo.distance
tagadhatja, de módosítania kell az összehasonlító operátort (geo.distance(...) lt x
az lesznot (geo.distance(...) ge x)
ésgeo.distance(...) le x
válik).not (geo.distance(...) gt x)
- Egy adott testben
all
ageo.intersects
függvényt el kell tagadni. Ezzel szemben a függvényt nem szabad tagadni a testbenany
geo.intersects
. - Egy geo-térbeli kifejezés törzsében
any
kombinálhatók a következőkkelor
: . A törzsbenall
az ilyen kifejezések kombinálhatókand
.
A fenti korlátozások hasonló okokból léteznek, mint a sztringgyűjtemények egyenlőségi/egyenlőtlenségi korlátozása. Az OData-gyűjteményszűrők ismertetése az Azure AI Searchben ezen okok részletesebb ismertetését ismerteti.
Íme néhány példa az engedélyezett gyűjtemények szűrőire Edm.GeographyPoint
:
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))'))
A gyűjteményekben nem engedélyezettek Edm.GeographyPoint
az olyan kifejezések, mint a következő:
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))'))
Az összehasonlítható gyűjtemények szűrésének szabályai
Ez a szakasz az alábbi adattípusokra vonatkozik:
Collection(Edm.DateTimeOffset)
Collection(Edm.Double)
Collection(Edm.Int32)
Collection(Edm.Int64)
Az összehasonlító operátorok közül mind a hat típust támogatják: , , ne
, lt
le
, gt
és ge
. eq
Edm.Int32
Edm.DateTimeOffset
Az ilyen típusú gyűjteményeken keresztüli Lambda-kifejezések ezen operátorok bármelyikét használó egyszerű kifejezéseket tartalmazhatnak. Ez mind a mind any
all
a . Ezek a szűrők például engedélyezettek:
ratings/any(r: r ne 5)
dates/any(d: d gt 2017-08-24T00:00:00Z)
not margins/all(m: m eq 3.5)
Vannak azonban korlátozások arra, hogy az ilyen összehasonlító kifejezések hogyan kombinálhatók összetettebb kifejezésekké egy lambda kifejezésen belül:
- Szabályok a következőhöz
any
:Az egyszerű egyenlőtlenségi kifejezések nem kombinálhatók más kifejezésekkel. Ez a kifejezés például engedélyezett:
ratings/any(r: r ne 5)
de ez a kifejezés nem:
ratings/any(r: r ne 5 and r gt 2)
és bár ez a kifejezés engedélyezett, nem hasznos, mert a feltételek átfedésben vannak:
ratings/any(r: r ne 5 or r gt 7)
Egyszerű összehasonlító kifejezések , beleértve
eq
a ,lt
,le
,gt
, vagyge
kombinálható .and
/or
Példa:ratings/any(r: r gt 2 and r le 5)
ratings/any(r: r le 5 or r gt 7)
Az összehasonlító kifejezések és a
and
(kötőszavak) együttes használata tovább kombinálhatóor
. Ez az űrlap logikai logikában "Disjunctive Normal Form" (DNF) néven ismert. Példa:ratings/any(r: (r gt 2 and r le 5) or (r gt 7 and r lt 10))
- Szabályok a következőhöz
all
:Az egyszerű egyenlőségi kifejezések nem kombinálhatók más kifejezésekkel. Ez a kifejezés például engedélyezett:
ratings/all(r: r eq 5)
de ez a kifejezés nem:
ratings/all(r: r eq 5 or r le 2)
és bár ez a kifejezés engedélyezett, nem hasznos, mert a feltételek átfedésben vannak:
ratings/all(r: r eq 5 and r le 7)
Egyszerű összehasonlító kifejezések , beleértve
ne
a ,lt
,le
,gt
, vagyge
kombinálható .and
/or
Példa:ratings/all(r: r gt 2 and r le 5)
ratings/all(r: r le 5 or r gt 7)
Az összehasonlító kifejezések és
or
a (letiltások) együttes használata tovább kombinálhatóand
. Ez az űrlap logikai logikában "Conjunctive Normal Form" (CNF) néven ismert. Példa:ratings/all(r: (r le 2 or gt 5) and (r lt 7 or r ge 10))
Az összetett gyűjtemények szűrésének szabályai
A Lambda-kifejezések összetett gyűjteményeken keresztül sokkal rugalmasabb szintaxist támogatnak, mint a lambda kifejezések a primitív típusú gyűjtemények esetében. Egy olyan lambdakifejezésen belül bármilyen szűrőszerkezetet használhat, amelyet az egyiken kívül is használhat, csak két kivétellel.
Először is, a függvények search.ismatch
search.ismatchscoring
és nem támogatottak a lambda kifejezésekben. További információ: OData-gyűjteményszűrők ismertetése az Azure AI Searchben.
Másodszor, a tartományváltozóhoz (úgynevezett szabad változókhoz) nem kötött mezőkre való hivatkozás nem engedélyezett. Vegyük például a következő két egyenértékű OData-szűrőkifejezést:
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))
Az első kifejezés engedélyezett, míg a második űrlap elutasítva, mert details/margin
nincs a tartományváltozóhoz s
kötve.
Ez a szabály olyan kifejezésekre is kiterjed, amelyek külső hatókörben kötött változókkal rendelkeznek. Az ilyen változók a megjelenési hatókörük tekintetében ingyenesek. Az első kifejezés például engedélyezett, míg a második egyenértékű kifejezés nem engedélyezett, mert s/name
a tartományváltozó a
hatóköre szempontjából ingyenes:
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'))
Ez a korlátozás a gyakorlatban nem jelenthet problémát, mivel mindig lehet olyan szűrőket létrehozni, amelyek csak kötött változókat tartalmaznak.
Gyűjteményszűrési szabályok csalólapja
Az alábbi táblázat összefoglalja az egyes gyűjtemény-adattípusok érvényes szűrőinek létrehozására vonatkozó szabályokat.
Adattípus | Lambda-kifejezésekben engedélyezett funkciók a következőkkel: any |
Lambda-kifejezésekben engedélyezett funkciók a következőkkel: all |
---|---|---|
Collection(Edm.ComplexType) |
Minden, kivéve search.ismatch és search.ismatchscoring |
Ugyanaz |
Collection(Edm.String) |
Összehasonlítások a eq search.in Alkifejezések kombinálása or |
Összehasonlítások a ne not search.in() Alkifejezések kombinálása and |
Collection(Edm.Boolean) |
Összehasonlítások a eq ne |
Ugyanaz |
Collection(Edm.GeographyPoint) |
Használat geo.distance a következővel vagy lt le geo.intersects Alkifejezések kombinálása or |
Használat geo.distance a következővel vagy gt ge not geo.intersects(...) Alkifejezések kombinálása and |
Collection(Edm.DateTimeOffset) , Collection(Edm.Double) , Collection(Edm.Int32) Collection(Edm.Int64) |
Összehasonlítások a következőkkel: eq , ne , lt , gt , le vagy ge Összehasonlítások kombinálása más alkifejezésekkel or Összehasonlítások kombinálása más alkifejezések kivételével ne and Kifejezések disjunctive Normal Form (DNF) és "Disjunctive Normal Form" (Disjunctive Normal Form, DNF) kombinációit and or használó kifejezések |
Összehasonlítások a következőkkel: eq , ne , lt , gt , le vagy ge Összehasonlítások kombinálása más alkifejezésekkel and Összehasonlítások kombinálása más alkifejezések kivételével eq or Kifejezések a conjunctive Normal Form (CNF) és a and or "Conjunctive Normal Form" (Conjunctive Normal Form) kombinációit használó kifejezések |
Az egyes esetekhez érvényes szűrők létrehozására vonatkozó példákért tekintse meg az érvényes gyűjteményszűrők írását ismertető témakört.
Ha gyakran ír szűrőket, és az első alapelvek szabályainak megértése nem csupán azokat írja meg, olvassa el az OData-gyűjteményszűrők ismertetése az Azure AI Searchben című témakört.