Megosztás a következőn keresztül:


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

A sztringgyűjtemények Lambda-kifejezései között az egyetlen használható összehasonlító operátor az eq és nea .

Feljegyzés

Az Azure AI Search nem támogatja a ltgtge/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 allkeresztüland. Mivel a search.in függvény egyenértékű az egyenlőségi ellenőrzések orkombiná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 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 anycsak vagy le.lt Ehhez allcsak vagy ge.gt A kifejezéseket geo.distancetagadhatja, de módosítania kell az összehasonlító operátort (geo.distance(...) lt xaz lesz not (geo.distance(...) ge x) és geo.distance(...) le x válik).not (geo.distance(...) gt x)
  • Egy adott testben alla geo.intersects függvényt el kell tagadni. Ezzel szemben a függvényt nem szabad tagadni a testbenanygeo.intersects.
  • Egy geo-térbeli kifejezés törzsében anykombinálhatók a következőkkel or: . A törzsben allaz ilyen kifejezések kombinálhatók and.

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, ltle, gtés ge. eqEdm.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 alla . 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 eqa , lt, le, gt, vagy ge 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 nea , lt, le, gt, vagy ge 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:

  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 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 eqsearch.in

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

Alkifejezések kombinálása and
Collection(Edm.Boolean) Összehasonlítások a eqne Ugyanaz
Collection(Edm.GeographyPoint) Használat geo.distance a következővel vagy ltle

geo.intersects

Alkifejezések kombinálása or
Használat geo.distance a következővel vagy gtge

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 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, 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 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.

Következő lépések