Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Poznámka:
Azure AI Vyhledávač je k dispozici prostřednictvím portálu Azure, rozhraní REST API a Sady Azure SDK. Podporuje také Foundry IQ, spravovanou znalostní vrstvu, která transformuje podnikový obsah na opakovaně použitelné znalostní báze s podporou oprávnění pro agenty na portálu Microsoft Foundry.
Pokud chcete filtrovat pole kolekce v Azure AI Vyhledávač, můžete použít operátory any a all společně s lambda výrazy. Výraz lambda je podfiltr, který se použije pro každý prvek kolekce.
Ne každá funkce výrazů filtru je k dispozici uvnitř výrazu lambda. Které funkce jsou k dispozici, závisí na datovém typu pole kolekce, které chcete filtrovat. Toto omezení může způsobit chybu, pokud se pokusíte použít funkci ve výrazu lambda, který není v tomto kontextu podporovaný. Pokud při pokusu o zápis komplexního filtru polí kolekce narazíte na takové chyby, pomůže vám tento článek problém vyřešit.
Běžné chyby filtru kolekcí
Následující tabulka uvádí chyby, se kterými se můžete setkat při pokusu o spuštění filtru kolekce. K těmto chybám dochází při použití funkce výrazů filtru, které nejsou podporovány uvnitř výrazu lambda. Každá chyba obsahuje pokyny, jak můžete filtr přepsat, abyste se této chybě vyhnuli. Tabulka obsahuje také odkaz na příslušnou část tohoto článku, která obsahuje další informace o tom, jak se této chybě vyhnout.
| Chybová zpráva | Situace | Detaily |
|---|---|---|
Funkce ismatch nemá žádné parametry vázané na proměnnou rozsahu 's'. Uvnitř výrazů lambda ('any' nebo 'all') se podporují pouze odkazy na vázané pole. Filtr ale můžete změnit tak, aby funkce ismatch byla mimo výraz lambda, a zkuste to znovu. |
Použití search.ismatch nebo search.ismatchscoring uvnitř výrazu lambda |
Pravidla pro filtrování složitých kolekcí |
| Neplatný výraz lambda Zjistili jsme test na rovnost nebo nerovnost, u kterého byl v lambda výrazu očekáván opačný výsledek, iterující pole typu Collection(Edm.String). Pro "any" použijte výrazy ve tvaru "x eq y" nebo "search.in(...)". Pro "all" použijte výrazy ve tvaru x ne y, "not (x eq y)" nebo "ne search.in(...)". | Filtrování podle pole typu Collection(Edm.String) |
Pravidla pro filtrování kolekcí řetězců |
Neplatný výraz lambda Byla nalezena nepodporovaná podoba komplexního Booleovského výrazu. U "any" použijte výrazy, které jsou "ORy z ANDů", označované také jako disjunktivní normální forma. Například: kde a (a and b) or (c and d) , b, c a a d jsou porovnání nebo podvýrazy rovnosti. Pro "vše" použijte výrazy, které jsou AND ORS, označované také jako konjunktivní normální formulář. Příklad: (a or b) and (c or d) kde a, b, c a d jsou dílčí výrazy porovnání nebo nerovnosti. Příklady porovnávacích výrazů: x gt 5, x le 2 Příklad výrazu rovnosti: x eq 5 Příklad výrazu nerovnosti: x ne 5 |
Filtrování podle polí typu Collection(Edm.DateTimeOffset), Collection(Edm.Double), Collection(Edm.Int32)nebo Collection(Edm.Int64) |
Pravidla pro filtrování srovnatelných kolekcí |
| Neplatný výraz lambda Zjistili jsme nepodporované použití geo.distance() nebo geo.intersects() ve výrazu lambda, který iteruje přes instanci typu Collection(Edm.GeographyPoint). U operátoru any se ujistěte, že porovnáváte geo.distance() pomocí operátorů lt nebo le a ujistěte se, že jakékoli použití geo.intersects() není negované. V případě "all" se ujistěte, že porovnáváte geo.distance() pomocí operátorů "gt" nebo "ge" a ujistěte se, že je jakékoli použití geo.intersects() negované. | Filtrování podle pole typu Collection(Edm.GeographyPoint) |
Pravidla pro filtrování kolekcí GeographyPoint |
| Neplatný výraz lambda Komplexní logické výrazy nejsou podporovány ve výrazech lambda, které iterují nad poli typu Collection(Edm.GeographyPoint). Pro "any" použijte spojení podvýrazů s 'or'; "and" není podporováno. Pro 'all' spojte dílčí výrazy s „a“; „nebo“ není podporováno. | Filtrování podle polí typu Collection(Edm.String) nebo Collection(Edm.GeographyPoint) |
Pravidla pro filtrování kolekcí řetězců Pravidla pro filtrování kolekcí GeographyPoint |
| Neplatný výraz lambda Našli jsme relační operátor (jeden z "lt", "le", "gt" nebo "ge"). V lambda výrazech, které iterují přes pole typu Collection(Edm.String), jsou povoleny pouze operátory rovnosti. Pro operátor „any“ použijte výrazy ve tvaru „x eq y“. Pro "all" použijte výrazy ve tvaru x ne y nebo "ne (x eq y)". | Filtrování podle pole typu Collection(Edm.String) |
Pravidla pro filtrování kolekcí řetězců |
Jak psát platné filtry kolekcí
Pravidla pro zápis platných filtrů kolekcí se pro každý datový typ liší. Následující části popisují pravidla zobrazením příkladů podporovaných funkcí filtru, které nejsou podporované:
- Pravidla pro filtrování kolekcí řetězců
- Pravidla pro filtrování logických kolekcí
- Pravidla pro filtrování kolekcí GeographyPoint
- Pravidla pro filtrování srovnatelných kolekcí
- Pravidla pro filtrování složitých kolekcí
Pravidla pro filtrování kolekcí řetězců
Uvnitř lambda výrazů pro kolekce řetězců jsou jedinými porovnávacími operátory, které lze použít, eq a ne.
Poznámka:
Azure AI Vyhledávač nepodporuje lt/le/gt/geoperátory pro řetězce bez ohledu na to, jestli uvnitř výrazu lambda nebo mimo ni.
Tělo any může testovat pouze rovnost, zatímco tělo může all testovat pouze nerovnost.
Je také možné zkombinovat více výrazů pomocí or v těle any, a pomocí and v těle all. Vzhledem k tomu, že search.in funkce je ekvivalentní kombinování kontrol rovnosti s or, je také povolena v těle objektu any. Naopak, not search.in je povoleno v těle all.
Například tyto výrazy jsou povolené:
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'))
I když tyto výrazy nejsou povolené:
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'))
Pravidla pro filtrování logických kolekcí
Edm.Boolean podporuje pouze operátory eq a ne. Proto nemá smysl povolit kombinování takových klauzulí, které kontrolují stejnou proměnnou and/or rozsahu, protože by to vždy vedlo k tautologiím nebo rozporům.
Tady je několik příkladů filtrů u logických kolekcí, které jsou povolené:
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))
Na rozdíl od kolekcí řetězců nemají Booleovské kolekce žádné omezení ohledně toho, který operátor lze použít v jakém typu výrazu lambda. Obě eq a ne mohou být použity v těle any nebo all.
Následující výrazy nejsou povoleny pro logické kolekce:
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)
Pravidla pro filtrování kolekcí GeographyPoint
Hodnoty typu Edm.GeographyPoint v kolekci se nedají porovnat přímo s ostatními. Místo toho je nutné je použít jako parametry funkce geo.distance a geo.intersects. Funkce geo.distance se pak musí porovnávat s hodnotou vzdálenosti pomocí jednoho z relačních operátorů lt, , le, gtnebo ge. Tato pravidla platí také pro pole Edm.GeographyPoint, která nejsou sbírkami.
Podobně jako u kolekcí Edm.GeographyPoint řetězců mají kolekce určitá pravidla pro použití a kombinování geografických funkcí v různých typech výrazů lambda:
- Které relační operátory můžete použít s
geo.distancefunkcí, závisí na typu výrazu lambda. Proany, můžete použít pouzeltnebole. Proall, můžete použít pouzegtneboge. Můžete negovat výrazy zahrnujícígeo.distance, ale musíte změnit relační operátor (geo.distance(...) lt xstanenot (geo.distance(...) ge x)se ageo.distance(...) le xstanenot (geo.distance(...) gt x)). - V těle
allmusí být funkcegeo.intersectsnegována. Naopak v těleanynesmí býtgeo.intersectsfunkce negovány. - V těle
anymohou být geoprostorové výrazy kombinovány pomocíor. V tělealllze takové výrazy kombinovat pomocíand.
Omezení uvedená výše existují z obdobných důvodů jako omezení týkající se rovnosti/nerovnosti u kolekcí řetězců. V tématu Principy filtrů kolekcí OData ve službě Azure AI Vyhledávač se podrobněji podívejte na tyto důvody.
Tady je několik příkladů filtrů u Edm.GeographyPoint kolekcí, které jsou povolené:
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))'))
Výrazy, jako například následující, nejsou povoleny pro Edm.GeographyPoint kolekce:
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))'))
Pravidla pro filtrování srovnatelných kolekcí
Tato část se vztahuje na všechny následující datové typy:
Collection(Edm.DateTimeOffset)Collection(Edm.Double)Collection(Edm.Int32)Collection(Edm.Int64)
Typy jako Edm.Int32 a Edm.DateTimeOffset podporují všech šest operátorů porovnání: eq, ne, lt, le, gt a ge. Výrazy lambda nad kolekcemi těchto typů můžou obsahovat jednoduché výrazy pomocí některého z těchto operátorů. To platí pro obě any i all. Například jsou povoleny tyto filtry:
ratings/any(r: r ne 5)dates/any(d: d gt 2017-08-24T00:00:00Z)not margins/all(m: m eq 3.5)
Existují však omezení, jak lze takové porovnávací výrazy kombinovat do složitějších výrazů uvnitř výrazu lambda:
- Pravidla pro
any:Jednoduché výrazy nerovnosti se nedají užitečně kombinovat s žádnými dalšími výrazy. Tento výraz je například povolený:
ratings/any(r: r ne 5)
ale tento výraz není správný:
ratings/any(r: r ne 5 and r gt 2)
a i když je tento výraz povolený, není užitečný, protože se podmínky překrývají:
ratings/any(r: r ne 5 or r gt 7)
Jednoduché porovnávací výrazy zahrnující
eq, ,ltle,gt, nebogemohou být kombinovány sand/or. Příklad:ratings/any(r: r gt 2 and r le 5)ratings/any(r: r le 5 or r gt 7)
Porovnání výrazů v kombinaci s
and(spojeními) lze dále kombinovat pomocíor. Tento formulář je známý v logické logice jako "Disjunktivní normální formulář" (DNF). Příklad:ratings/any(r: (r gt 2 and r le 5) or (r gt 7 and r lt 10))
- Pravidla pro
all:Jednoduché výrazy rovnosti nelze užitečně kombinovat s žádnými jinými výrazy. Tento výraz je například povolený:
ratings/all(r: r eq 5)
ale tento výraz není správný:
ratings/all(r: r eq 5 or r le 2)
a i když je tento výraz povolený, není užitečný, protože se podmínky překrývají:
ratings/all(r: r eq 5 and r le 7)
Jednoduché porovnávací výrazy zahrnující
ne, ,ltle,gt, nebogemohou být kombinovány sand/or. Příklad:ratings/all(r: r gt 2 and r le 5)ratings/all(r: r le 5 or r gt 7)
Porovnání výrazů v kombinaci s
or(disjunkcemi) lze dále kombinovat pomocíand. Tato forma je známá v Booleovské logice jako "Konjunktivní normální forma" (CNF). Příklad:ratings/all(r: (r le 2 or r gt 5) and (r lt 7 or r ge 10))
Pravidla pro filtrování složitých kolekcí
Výrazy lambda u složitých kolekcí podporují mnohem flexibilnější syntaxi než výrazy lambda v kolekcích primitivních typů. Můžete použít libovolnou konstrukci filtru uvnitř takového výrazu lambda, kterou můžete použít i vně výrazu, s pouze dvěma výjimkami.
Za prvé, funkce search.ismatch a search.ismatchscoring nejsou podporovány uvnitř výrazů lambda. Další informace najdete v tématu Principy filtrů kolekce OData ve službě Azure AI Vyhledávač.
Za druhé, odkazování na pole, která nejsou svázaná s proměnnou rozsahu (tzv . volných proměnných), není povolená. Představte si například následující dva ekvivalentní výrazy filtru OData:
stores/any(s: s/amenities/any(a: a eq 'parking')) and details/margin gt 0.5stores/any(s: s/amenities/any(a: a eq 'parking' and details/margin gt 0.5))
První výraz je povolen, zatímco druhý formulář je odmítnut, protože details/margin není vázán na proměnnou srozsahu .
Toto pravidlo se rovněž vztahuje na výrazy, které mají proměnné vázané ve vnějším oboru. Tyto proměnné jsou volné vzhledem k rozsahu, ve kterém se zobrazují. První výraz je například povolený, zatímco druhý ekvivalentní výraz není povolený, protože s/name je volný vzhledem k rozsahu proměnné arozsahu:
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'))
Toto omezení by nemělo být v praxi problém, protože vždy je možné vytvořit filtry tak, aby výrazy lambda obsahovaly pouze vázané proměnné.
Přehled pravidel filtru pro kolekce
Následující tabulka shrnuje pravidla pro vytváření platných filtrů pro každý datový typ kolekce.
| Datový typ | Funkce povolené ve výrazech lambda s využitím any |
Funkce povolené ve výrazech lambda s využitím all |
|---|---|---|
Collection(Edm.ComplexType) |
Vše kromě search.ismatch a search.ismatchscoring |
Stejné |
Collection(Edm.String) |
Porovnání s eq nebo search.in Kombinování dílčích výrazů s or |
Porovnání s ne nebo not search.in() Kombinování dílčích výrazů s and |
Collection(Edm.Boolean) |
Porovnání s eq nebo ne |
Stejné |
Collection(Edm.GeographyPoint) |
Použití geo.distance s lt nebo le geo.intersects Kombinování dílčích výrazů s or |
Použití geo.distance s gt nebo ge not geo.intersects(...) Kombinování dílčích výrazů s and |
Collection(Edm.DateTimeOffset), Collection(Edm.Double), , Collection(Edm.Int32)Collection(Edm.Int64) |
Porovnání pomocí eq, , nelt, gt, , le, neboge Kombinování porovnání s jinými dílčími výrazy pomocí or Kombinování porovnání, s výjimkou ne, s jinými dílčími výrazy pomocí and Výrazy používající kombinace and a or v disjunktivní normální formě (DNF) |
Porovnání pomocí eq, , nelt, gt, , le, neboge Kombinování porovnání s jinými dílčími výrazy pomocí and Kombinování porovnání, s výjimkou eq, s jinými dílčími výrazy pomocí or Výrazy používající kombinace and a or v konjunktivní normální formě (CNF) |
Příklady, jak vytvořit platné filtry pro jednotlivé případy, naleznete v tématu Jak zapsat platné filtry kolekce.
Pokud zapisujete filtry často a rozumíte pravidlům z prvních principů, pomůže vám to více než jen jejich zapamatování, přečtěte si téma Principy filtrů kolekce OData ve službě Azure AI Vyhledávač.