OData-gyűjteményszűrők hibaelhárítása az Azure AI Keresésben

Megjegyzés

Azure AI Keresés a Azure portálon, REST API-kon és Azure SDK-k keresztül érhető el. Emellett a Foundry IQ-t is támogatja, amely a vállalati tartalmakat újrafelhasználható, engedélytudatos tudásbázisokká alakítja át az Microsoft Foundry portálon található ügynökök számára.

Az Azure AI Keresés gyűjteménymezőire való szűréshez használhatja a és any operátorokat együtt all. 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üggenek. Ez a korlátozás 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 elhárítani a problémát.

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ésben a search.ismatch vagy search.ismatchscoring használata 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(...)" kifejezéseket. Az 'all' kifejezéshez használjon az "x ne y", a "not (x eq y)" vagy a "not search.in(...)" alakú kifejezéseket. Szűrés egy típusmezőn Collection(Edm.String) Sztringgyűjtemények szűrésének szabályai
Érvénytelen lambda kifejezés. Egy nem támogatott formájú összetett logikai kifejezést találtak. 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 csatolja össze az alkifejezéseket a "vagy" operátorral; az 'és' operátor nem támogatott. Az "összes" esetében kösse össze a részkifejezéseket az 'és' operátorral; az "or" nem támogatott. Szűrés mezők, amelyek típusa 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 használjon „x eq y” formájú kifejezéseket. 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

A sztringgyűjtemények lambda-kifejezésein belül az egyetlen használható összehasonlító operátorok a eq és a ne.

Megjegyzés

Az Azure AI Keresés nem támogatja a lt/le/gt/gesztringek operátorait, akár egy lambda kifejezésen belül, akár azon kívül.

A any teste csak az egyenlőséget tesztelheti, míg a all csak az egyenlőtlenséget tesztelheti.

Több kifejezést is kombinálhat a or törzsében lévő any és a and törzsében lévő all keresztül. Mivel a search.in függvény egyenértékű az egyenlőségi ellenőrzések or-val való kombinálásával, ez a függvény a any törzsében is megengedett. Ezzel szemben a not search.in engedélyezett egy all törzsében.

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 eq az ne 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ó. Mind eq, mind ne használható a any vagy all törzsében.

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 őket a geo.distance és geo.intersects függvények paramétereként kell használni. A geo.distance függvényt egy távolságértékkel kell összehasonlítani az összehasonlító operátorok ltegyikével , legtvagy 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. Ehhez a any-hez csak a lt vagy a le használható. Ehhez a all-hez csak a gt vagy a ge használható. A geo.distance tartalmazó kifejezéseket tagadhatja, de módosítania kell az összehasonlító operátort: az geo.distance(...) lt x helyett not (geo.distance(...) ge x) lesz, és a geo.distance(...) le x helyett not (geo.distance(...) gt x) válik.
  • Egy all esetén a geo.intersects függvényt meg kell tagadni. Ezzel szemben a any testen belül a geo.intersects függvényt nem szabad tagadni.
  • A any testben geotérbeli kifejezések kombinálhatók or segítségével. A törzsben all, az ilyen kifejezések kombinálhatók and.

A fenti korlátozások ugyanazokból az okokból léteznek, mint a karakterlánc-gyűjtemények egyenlőségi/egyenlőtlenségi korlátozása. Az OData-gyűjteményszűrők ismertetése az Azure AI Keresésben 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))'))

Edm.GeographyPoint kollekciók esetén nem engedélyezettek az olyan kifejezések, mint a következők:

  • 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 olyan típusok, mint a Edm.Int32 és Edm.DateTimeOffset, mind a hat összehasonlító operátort támogatják: eq, ne, lt, le, gt, és ge. 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 vonatkozik mind a any, mind pedig a all-re. 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 any számára:
    • 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, amelyek eq, lt, le, gt vagy ge-et tartalmaznak, kombinálhatók and/or-tel. Példa:

      • ratings/any(r: r gt 2 and r le 5)
      • ratings/any(r: r le 5 or r gt 7)
    • A and (kötőszókkal) kombinált összehasonlító kifejezések tovább kombinálhatók or. Ez a forma a logikában "Disjunktív Normál Forma" (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 all számára:
    • 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, amelyek ne, lt, le, gt vagy ge-et tartalmaznak, kombinálhatók and/or-tel. 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éseket or, azaz a kizárásokat, tovább lehet kombinálni and-nel. Ez az alak a Boole-algebrában "Konjunktív Normál Formaként" (CNF) ismert. Példa:

      • ratings/all(r: (r le 2 or r 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 és search.ismatchscoring nem támogatottak a lambda kifejezésekben. További információ: OData-gyűjteményszűrők ismertetése az Azure AI Keresésben.

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:

  1. stores/any(s: s/amenities/any(a: a eq 'parking')) and details/margin gt 0.5
  2. 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 skö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ó ahatóköre szempontjából ingyenes:

  1. stores/any(s: s/amenities/any(a: a eq 'parking') and s/name ne 'Flagship')
  2. stores/any(s: s/amenities/any(a: a eq 'parking' and s/name ne 'Flagship'))

Ez a korlátozás a gyakorlatban nem jelent problémát, mivel mindig létrehozhatók olyan szűrők, amelyekben a lambda kifejezések 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 A lambda-kifejezésekben engedélyezett funkciók: any A lambda-kifejezésekben engedélyezett funkciók: all
Collection(Edm.ComplexType) Minden, kivéve search.ismatch és search.ismatchscoring Ugyanaz
Collection(Edm.String) Összehasonlítások a eq vagy search.in

Alkifejezések kombinálása or
Összehasonlítások a ne vagy not search.in()

Alkifejezések kombinálása and
Collection(Edm.Boolean) Összehasonlítások a eq vagy ne Ugyanaz
Collection(Edm.GeographyPoint) geo.distance használata lt vagy le

geo.intersects

Alkifejezések kombinálása or
geo.distance használata gt vagy 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, levagy 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 neand

Kifejezések a and és or kombinációival a diszjunktív normál formában (DNF)
Összehasonlítások a következőkkel: eq, ne, lt, gt, levagy 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 eqor

Kifejezések, amelyek and és or kombinációkat használnak a konjunktív normál formában (CNF)

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 jobban szeretné megérteni az első alapelvek szabályait mint csupán memorizálni őket, olvassa el az OData-gyűjteményszűrők megértése az Azure AI Keresés című dokumentációt.

Következő lépések