Syntaxe dotazů Lucene ve službě Azure AI Vyhledávač

Note

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.

Při vytváření dotazů ve službě Azure AI Vyhledávač můžete zvolit úplnou syntaxi Analyzátoru dotazů Lucene pro specializované formuláře dotazů: zástupné znaky, přibližné vyhledávání, proximální vyhledávání, regulární výrazy. Většina syntaxe Analyzátoru dotazů Lucene se v Azure AI Vyhledávač implementuje beze změny, s výjimkou hledání v rozsahu, které se vytvářejí prostřednictvím $filter výrazů.

Pokud chcete použít úplnou syntaxi Lucene, nastavte queryType na full a zadejte výraz dotazu přizpůsobený pro zástupné znaky, přibližné vyhledávání, nebo jeden z dalších typů dotazu podporovaných plnou syntaxí. V REST se výrazy dotazu zadají v search parametru požadavku REST API (Search Documents).

Příklad (úplná syntaxe)

Následující příklad je požadavek vyhledávání vytvořený pomocí úplné syntaxe. Tento konkrétní příklad ukazuje vyhledávání podle polí a zvýraznění fráze. Hledá hotely, ve kterých pole kategorie obsahuje termín budget. Dokumenty obsahující frázi "recently renovated" získají dodatečnou váhu a v důsledku hodnoty posílení fráze (3) se mohou umístit výše.

POST /indexes/hotels-sample/docs/search?api-version=2026-04-01
{
  "queryType": "full",
  "search": "category:budget AND \"recently renovated\"^3",
  "searchMode": "all"
}

I když není specifický pro žádný typ dotazu, parametr je v tomto příkladu searchMode relevantní. Kdykoli jsou operátory v dotazu, měli byste obecně nastavit searchMode=all , aby se zajistilo, že se shodují všechna kritéria.

Další příklady najdete v příkladech syntaxe dotazů Lucene. Podrobnosti o požadavku a parametrech dotazu, včetně searchMode, najdete v tématu Dokumenty vyhledávání (REST API).

Základy syntaxe

Následující základy syntaxe platí pro všechny dotazy, které používají syntaxi Lucene.

Vyhodnocení operátoru v kontextu

Umístění určuje, zda je symbol interpretován jako operátor nebo jen jiný znak v řetězci.

Například v úplné syntaxi Lucene se tilda (~) používá pro vyhledávání přibližných shod i vyhledávání podle vzdálenosti. Při umístění za citovanou frází ~ vyvolá vyhledávání na základě blízkosti. Při umístění na konec termínu vyvolá ~ přibližné hledání.

V rámci nějakého termínu, například business~analyst, se znak nevyhodnocuje jako operátor. V tomto případě, za předpokladu, že dotaz je termín nebo frázový dotaz, fulltextové vyhledávání s využitím lexikální analýzy odstraní ~ a rozdělí termín business~analyst na dva: business NEBO analyst.

Výše uvedený příklad je tilda (~), ale stejný princip se vztahuje na všechny operátory.

Escapování speciálních znaků

Pokud chcete jako součást hledaného textu použít některý z operátorů hledání, upravte ho přidáním jediného zpětného lomítka před něj (\). Například pro vyhledávání se zástupnými znaky https://, kde :// je součástí řetězce dotazu, byste zadali search=https\:\/\/*. Podobně by vzor uvedeného telefonního čísla mohl vypadat takto \+1 \(800\) 642\-7676.

Speciální znaky, které vyžadují escapování, jsou:
+ - & | ! ( ) { } [ ] ^ " ~ * ? : \ /

Note

I když escaping udržuje tokeny pohromadě, lexikální analýza během indexování je může odstranit. Například standardní analyzátor Lucene přeruší slova na spojovníkech, prázdných znacích a dalších znacích. Pokud v řetězci dotazu požadujete speciální znaky, možná budete potřebovat analyzátor, který je zachová v indexu. Mezi volby patří analyzátory jazyka Microsoft Natural, které zachovávají slova s dělením, nebo vlastní analyzátor pro složitější vzory. Další informace naleznete v části Částečné termíny, vzory a speciální znaky.

Kódování nebezpečných a rezervovaných znaků v adresách URL

Zajistěte, aby všechny nebezpečné a rezervované znaky byly kódovány v adrese URL. Například, # je nebezpečný znak, protože se jedná o identifikátor fragmentu nebo kotvy v adrese URL. Znak musí být kódován jako %23, pokud je použit v adrese URL. & a = jsou to příklady vyhrazených znaků, které oddělují parametry a určují hodnoty ve službě Azure AI Vyhledávač. Další podrobnosti najdete v tématu RFC1738: Uniform Resource Locators (URL).

Nebezpečné znaky jsou " ` < > # % { } | \ ^ ~ [ ]. Rezervované znaky jsou ; / ? : @ = + &.

Logické operátory

Logické operátory můžete vložit do řetězce dotazu, abyste zlepšili přesnost shody. Úplná syntaxe podporuje kromě znakových operátorů i textové operátory. Vždy pište textové booleovské operátory (AND, OR, NOT) velkými písmeny.

Textový operátor Character Example Usage
AND + wifi AND luxury Určuje podmínky, které musí shoda obsahovat. V tomto příkladu dotazovací modul hledá dokumenty obsahující obojí wifi i luxury. Znak plus (+) lze také použít přímo před výrazem, aby byl povinný. Například stanoví, +wifi +luxury že oba termíny musí být někde v poli jednoho dokumentu.
OR (žádný) 1 wifi OR luxury Najde shodu, když se najde některý z termínů. V tomto příkladu dotazovací modul vrátí shody u dokumentů obsahujících buď wifi nebo luxury obojí. U searchMode=any je OR výchozí spojovací operátor, takže wifi luxury je ekvivalentní k wifi OR luxury. Pomocí searchMode=all tohoto chování dosáhnete pomocí explicitního operátoru OR.
NOT !, - wifi –luxury Vrátí shodu u dokumentů, které vylučují termín. Například wifi –luxury hledá dokumenty, které mají wifi termín, ale ne luxury.

1 Znak | není podporován pro operace OR.

Booleovský operátor NOT

Important

Operátor NOT (NOT, !nebo -) se chová odlišně v plné syntaxi, než to dělá v jednoduché syntaxi.

  • V jednoduché syntaxi mají dotazy s negací vždy automaticky přidaný zástupný znak. Například dotaz -luxury se automaticky rozšíří na -luxury *.
  • V plné syntaxi nelze dotazy s negací kombinovat se zástupným znakem. Například dotazy -luxury * nejsou povolené.
  • V plné syntaxi nejsou dotazy s jedinou negací povoleny. Dotaz například -luxury není povolený.
  • V plné syntaxi se negace budou chovat, jako by byly vždy sloučeny pomocí logického AND na dotaz, bez ohledu na režim vyhledávání.
    • Například úplný syntaxní dotaz wifi -luxury v úplné syntaxi načte pouze dokumenty, které obsahují termín wifi, a pak použije negaci -luxury na tyto dokumenty.
  • Pokud chcete použít negace k vyhledávání ve všech dokumentech v indexu, doporučuje se jednoduchá syntaxe s režimem any vyhledávání.
  • Pokud chcete k vyhledávání podmnožinu dokumentů v indexu použít negace, doporučujeme použít úplnou syntaxi nebo jednoduchou syntaxi se všemi režimy vyhledávání.
Typ dotazu Režim hledání Příklad dotazu Behavior
Simple any wifi -luxury Vrátí všechny dokumenty v indexu. Dokumenty s termínem "wifi" nebo dokumenty, které nemají termín "luxusní", jsou seřazené výš než jiné dokumenty. Dotaz se rozbalí na wifi OR -luxury OR *.
Simple all wifi -luxury Vrátí pouze dokumenty v indexu, které obsahují termín "wifi" a neobsahují termín "luxusní". Dotaz se rozbalí na wifi AND -luxury AND *.
Full any wifi -luxury Vrátí pouze dokumenty v indexu, které obsahují termín "wifi", a dokumenty, které obsahují termín "luxusní", se z výsledků odeberou.
Full all wifi -luxury Vrátí pouze dokumenty v indexu, které obsahují termín "wifi", a dokumenty, které obsahují termín "luxusní", se z výsledků odeberou.

Hledání podle polí

Pomocí syntaxe můžete definovat operaci fieldName:searchExpression hledání v poli, ve které může být hledaný výraz jediným slovem nebo frází nebo složitějším výrazem v závorkách, volitelně s logickými operátory. Mezi příklady patří:

  • genre:jazz NOT history

  • artists:("Miles Davis" "John Coltrane")

Pokud chcete, aby se oba řetězce vyhodnotily jako jedna entita, nezapomeňte do uvozovek vložit více řetězců. V tomto případě hledáte dva různé umělce v artists poli.

Pole zadané v fieldName:searchExpression poli musí být searchable pole. Podrobnosti o tom, jak se atributy indexu používají v definicích polí, najdete v tématu Vytvoření indexu .

Note

Při použití polních vyhledávacích výrazů nemusíte používat parametr searchFields, protože každý polní vyhledávací výraz má explicitně zadaný název pole. Parametr ale můžete použít searchFields i v případě, že chcete spustit dotaz, ve kterém jsou některé části vymezeny na určité pole, a zbytek se může vztahovat na několik polí. Například dotaz search=genre:jazz NOT history&searchFields=description by odpovídal pouze poli jazz, zatímco by se genre shodoval s polem NOT history. Název pole zadaný vždy fieldName:searchExpression má přednost před parametremsearchFields, což je důvod, proč v tomto příkladu nemusíme do parametru genre zahrnoutsearchFields.

Fuzzy vyhledávání

Přibližné hledání najde shody v termínech, které mají podobnou konstrukci, a rozšiřuje termín až na maximálně 50 termínů, které splňují kritéria vzdálenosti dvou nebo méně. Další informace najdete v tématu Vyhledávání přibližných shod.

Pokud chcete provést přibližné hledání, použijte symbol tilda ~ na konci jednoho slova s volitelným parametrem, číslo mezi 0 a 2 (výchozí), které určuje vzdálenost úprav. Například blue~ , nebo blue~1 by vrátil blue, bluesa glue.

Přibližné vyhledávání lze použít pouze na jednotlivé termíny, nikoli na fráze uzavřené v uvozovkách, ale ke každému termínu můžete v názvu nebo víceslovné frázi připojit vlnovku samostatně. Například Unviersty~ of~ Wshington~ by se shodoval s University of Washington.

Vyhledávání v blízkosti

Hledání blízkosti se používá k nalezení termínů, které se v dokumentu nacházejí blízko u sebe. Na konec fráze vložte symbol tilda ~ následovaný počtem slov, která vytvoří hranici blízkosti. "hotel airport"~5 Například najde termíny hotel a airport během pěti slov od sebe v dokumentu.

Posílení termínu

Hledání si můžete představit jako dva kroky. Nejprve Azure AI Vyhledávač najde odpovídající dokumenty. Pak tyto shody seřadí. Zvýšení termínu má vliv jenom na druhý krok: může přesunout dokumenty, které odpovídají jedné části dotazu výše ve výsledcích.

Zvýšení termínu se liší od hodnoticího profilu. Zvýšení relevance zvýhodňuje slovo, frázi nebo skupinu výrazů v aktuálním dotazu. Profil bodování upřednostňuje pole nebo jiný obsah indexu podle pravidel definovaných v indexu.

Zvýšení rozsahu

Napište stříšku (^) a kladné číslo bezprostředně za část dotazu, kterou chcete upřednostnit. Například může tax^2 upřednostnit dokumenty, které obsahují tax, před dokumenty, které odpovídají pouze neposílenému výrazu. Výchozí hodnota zvýšení je 1. Můžete také použít hodnotu mezi 0 a 1, například 0.2, a přiřadit tak shodě nižší váhu.

Interpunkce vám řekne, která slova mají vliv na jednotlivé instrukce:

  • Název pole následovaný dvojtečkou, tzv. předpona pole, se objevuje před slovem, frází v uvozovkách nebo skupinou v závorkách. Například content: říká službě Azure AI Vyhledávač, aby hledala v poli content.
  • Zvýšení, například ^2, se zobrazí za slovem, citovanou frází nebo závorkou. Říká Azure AI Vyhledávač, co se má při hodnocení zápasů upřednostnění.

Následující tabulka používá výchozí searchMode=any, kde mezera mezi slovy funguje jako OR.

Query Co může odpovídat Čemu navýšení prospívá
deferred tax^2 deferred, taxnebo obojí. Pouze slovo tax.
"deferred tax"^2 Úplná fráze se slovy vedle sebe a v tomto pořadí. Úplná fráze.
(deferred OR tax)^2 deferred, taxnebo obojí. Všechno uvnitř závorek jako jedna skupina.

Při použití searchMode=all dotaz deferred tax^2 vyžaduje, aby se obě slova shodovala. Zvýšení stále platí pouze pro tax. Chcete-li místo toho spárovat některé slovo, napište deferred OR tax^2.

Umístěte kurzor za uzavírací uvozovku nebo závorku, pokud chcete zvýraznit celou frázi nebo skupinu. Závorky nevytvoří frázi. Použijte uvozovky, pokud musí být slova vedle sebe a v určitém pořadí.

Boost a rozsah pole

Název pole, za kterým následuje dvojtečka, omezuje, kde Azure AI Vyhledávač hledá. Navýšení relevance mění způsob, jakým Azure AI Vyhledávač hodnotí shodu. Oba můžete použít ve stejném dotazu.

Query Co to znamená
content:deferred tax^2 Předpona pole se vztahuje pouze na deferred. Samostatná část tax^2 používá pole vybraná pomocí searchFields nebo všechna prohledávatelná pole, pokud není zadáno searchFields. Shoda tax získá vyšší váhu v hodnocení.
content:"deferred tax"^2 Hledejte celou frázi pouze v content a této shodě fráze přiřaďte vyšší váhu.
content:(deferred OR tax)^2 Hledejte kterékoli z těchto slov pouze v content a seskupené shodě přiřaďte vyšší váhu v hodnocení.

Například pokud je searchFields nastaveno na title, první dotaz hledá deferred v content a tax v title. Uvozovky a závorky v ostatních dotazech ponechávají obě slova v content.

Important

Dvojtečka a stříščka fungují v opačných směrech. Předpona content: pole se vztahuje na část dotazu za ní. Navýšení ^2 se vztahuje na část dotazu před ním. Pokud chcete, aby tato část obsahovala více slov, použijte uvozovky nebo závorky. Další informace najdete v tématu Hledání v poli a Priorita (seskupování).

Účinek analyzátoru na posílené dotazy

U běžných slov, frází a skupin slov boosting nepřeskakuje analýzu textu. Před porovnávání Azure AI Vyhledávač text dotazu stále zpracovává pomocí analyzátoru jednotlivých polí. V důsledku toho se stejný zesílený text může v polích, která používají různé analyzátory, shodovat různě.

Fráze nebo skupina s předponou pole používá analyzátor daného pole. Text bez předpony pole používá analyzátor pro každé prohledávané pole. Například analyzátor, který převádí text na malá písmena, může porovnávat "DEFERRED TAX"^2 s indexovanými termíny psanými malými písmeny.

Jiné formuláře dotazů, jako jsou zástupné podoby, regulární výraz a přibližné dotazy, používají různá pravidla analýzy. Přidání boostu tato pravidla nemění. Další informace najdete v tématu Fáze 2: Lexikální analýza.

Hledání regulárních výrazů

Hledání regulárních výrazů najde shodu na základě vzorů, které jsou platné v rámci Apache Lucene, jak je uvedeno ve třídě RegExp.

Ve službě Azure AI Vyhledávač je regulární výraz:

  • Umístěno mezi lomítky //
  • Pouze malá písmena

Chcete-li například najít dokumenty obsahující motel nebo hotel, zadejte /[mh]otel/. Hledání regulárních výrazů je porovnáváno s jednotlivými slovy.

Některé nástroje a jazyky mají nad rámec pravidel pro escapování předepsaných Azure AI Vyhledávač další požadavky na escapování znaků. Pro JSON se řetězce, které obsahují lomítko, unikají zpětným lomítkem: microsoft.com/azure/ se stane search=/.*microsoft.com\/azure\/.*/, kde search=/.* <string-placeholder>.*/ nastaví regulární výraz a microsoft.com\/azure\/ je řetězec s unikajícím lomítkem.

Dva běžné symboly v dotazech regulárních výrazů jsou . a *. Element . odpovídá libovolnému jednomu znaku a element * odpovídá tomu předchozímu znaku nulakrát nebo vícekrát. Například /be./ odpovídá podmínkám bee a bet zatímco /be*/ by se shodovaly be, beea beee ale ne bet. Společně vám .* umožní zobrazit jakoukoli řadu znaků, takže /be.*/ odpovídá jakémukoli termínu, který začíná be, například better.

Pokud v regulárním výrazu dojde k chybám syntaxe, projděte si řídicí pravidla speciálních znaků. Můžete také vyzkoušet jiného klienta a ověřit, jestli je problém specifický pro nástroj.

Hledání pomocí zástupných znaků

Obecně rozpoznanou syntaxi můžete použít pro vyhledávání s více (*) nebo jedním (?) zástupným znakem. Úplná syntaxe Lucene podporuje porovnávání předpon a infixů. Pro porovnávání přípon použijte syntaxi regulárního výrazu .

Všimněte si, že analyzátor dotazů Lucene podporuje použití těchto symbolů s jedním termínem, nikoli frází.

Typ Affixu Popis a příklady
prefix Fragment termínu přichází před * nebo ?. Například výraz dotazu search=alpha* vrací alphanumeric nebo alphabetical. Porovnávání předpon je podporováno v jednoduché i úplné syntaxi.
suffix Fragment term přichází za * nebo ?, s lomítkem pro oddělení konstrukce. Například search=/.*numeric/ vrátí alphanumeric.
infix Fragmenty výrazů jsou uzavřeny v * nebo ?. Například search=non*al vrátí non-numerical a nonsensical.

Operátory můžete kombinovat v jednom výrazu. Například 980?2* odpovídá 98072-1222 a 98052-1234, kde ? odpovídá jednomu (povinnému) znaku a * odpovídá znakům jakékoliv délky, které následují.

Porovnávání regulárních výrazů vyžaduje šikmé čáry / jako oddělovače. Obecně platí, že nemůžete použít * ani ? symbol jako první znak termínu bez znaku /. Je také důležité si uvědomit, že * se chová jinak, když se používá mimo regulární výrazy. Mimo oddělovač lomítka / regulárního výrazu * je zástupný znak a odpovídá libovolné řadě znaků podobně jako .* v regulárním výrazu. Jako příklad search=/non.*al/ vytvoří stejnou sadu výsledků jako search=non*al.

Note

Porovnávání vzorů je obvykle pomalé, takže můžete chtít prozkoumat alternativní metody, jako jsou například hraniční n-gramy, které vytvářejí tokeny ze sekvencí znaků v termínu. Při tokenizaci n-gramu bude index větší, ale dotazy se můžou spouštět rychleji v závislosti na konstrukci vzoru a délce řetězců, které indexujete. Další informace najdete v tématu Hledání zkrácených termínů a vzorce se zvláštními znaky.

Účinek analyzátoru na dotazy se zástupnými znaky

Během analýzy dotazů se dotazy formulované jako předpona, přípona, zástupný znak nebo regulární výrazy předávají stromu dotazů tak, jak jsou, a obcházejí lexikální analýzu. Shody budou nalezeny pouze v případě, že index obsahuje řetězce ve formátu, který váš dotaz určuje. Ve většině případů potřebujete analyzátor během indexování, který zachovává integritu řetězců, aby částečné porovnávání termínů a vzorů proběhlo úspěšně. Další informace najdete v tématu Částečné hledání termínů v dotazech Azure AI Vyhledávač.

Představte si situaci, kdy byste mohli chtít, aby vyhledávací dotaz terminal* vracel výsledky obsahující termíny, jako terminateje , terminationa terminates.

Pokud byste použili analyzátor en.lucene (English Lucene), aplikoval by agresivní stemming každého termínu. Například terminate, termination, terminates budou všechny ztokenizovány na token termi ve vašem indexu. Na druhé straně nejsou termíny v dotazech používajících zástupné cardy nebo přibližné vyhledávání vůbec analyzovány, takže by nebyly žádné výsledky, které by odpovídaly terminat* dotazu.

Na druhé straně jsou analyzátory Microsoftu (v tomto případě analyzátor en.microsoft) trochu pokročilejší a používají lemmatizaci místo stemování. To znamená, že všechny vygenerované tokeny by měly být platná anglická slova. Například terminate, terminates a termination zůstanou většinou nezměněné v indexu a budou vhodnější volbou pro scénáře, které hodně závisí na zástupných znacích a přibližném vyhledávání.

Note

Výrazy dotazu se zástupnými znaky, předponami a regulárními výrazy se porovnávají s doslovnými tokeny v indexu. Protože většina analyzátorů převádí indexovaný obsah na malá písmena, výraz psaný velkými písmeny, například Contoso*, se nemusí shodovat s tokenem, jako je contoso. Převeďte tyto termíny dotazu ve své aplikaci na malá písmena na základě způsobu převodu na malá písmena analyzátoru přiřazeného k poli.

Vyhodnocování zástupných znaků a dotazů regulárních výrazů

Azure AI Vyhledávač používá pro textové dotazy hodnocení založené na frekvenci (BM25). U dotazů se zástupnými znaky a dotazů s regulárními výrazy, ve kterých může být rozsah termínů potenciálně široký, se však faktor frekvence ignoruje, aby se zabránilo zvýhodňování shod s méně častými termíny. Všechny shody se považují za rovnocenné pro vyhledávání pomocí zástupných znaků a regulárních výrazů.

Speciální znaky

Za určitých okolností můžete chtít vyhledat speciální znak, například znaménko emoji ❤ nebo znaménko €. V takových případech se ujistěte, že použitý analyzátor tyto znaky nefiltruje. Standardní analyzátor ignoruje mnoho speciálních znaků, a ty je z indexu vylučuje.

Analyzátory, které tokenizují speciální znaky, zahrnují analyzátor prázdných znaků, který bere v úvahu všechny sekvence znaků oddělené prázdnými znaky jako tokeny (takže řetězec by se považoval za token). Analyzátor jazyka, jako je například Microsoft English Analyzer (en.microsoft), by také jako token vzal řetězec "€". Analyzátor můžete otestovat a zjistit, jaké tokeny generuje pro daný dotaz.

Při použití znaků Unicode se ujistěte, že symboly jsou v adrese URL dotazu správně escapovány (například pro je použita escape sekvence %E2%9D%A4+). Někteří klienti REST tento překlad dělají automaticky.

Priorita (seskupení)

Pomocí závorek můžete určit, které části dotazu se vyhodnocují společně. Například motel AND (wifi OR luxury) vyžaduje motel a alespoň jeden z termínů uvnitř závorek: wifi nebo luxury.

Umístěte prefix pole před skupinu v závorkách, aby se celá tato skupina prohledávala v jednom poli. Například hotelAmenities:(wifi OR pool) hledá wifi nebo pool jen v hotelAmenities poli.

Závorky určují, jak AND a OR fungují společně. Nevyžadují, aby se slova zobrazovala vedle sebe nebo v určitém pořadí. Pro toto chování použijte uvozovky. Chcete-li umocnit skupinu, umístěte kurzor za uzavírací závorku, jako zde: hotelAmenities:(wifi OR pool)^2. Další informace najdete v tématu Zvýšení rozsahu.

Omezení velikosti dotazů

Azure AI Vyhledávač omezuje velikost a složení dotazů, protože nevázané dotazy mohou destabilizovat vaši vyhledávací službu. Existují omezení velikosti a složení dotazu (počet klauzulí). Omezení existují také pro délku vyhledávání předpon a složitost vyhledávání regulárních výrazů a vyhledávání se zástupnými čísly. Pokud vaše aplikace generuje vyhledávací dotazy prostřednictvím kódu programu, doporučujeme ho navrhnout tak, aby negenerovala dotazy s nevázanou velikostí.

Další informace o limitech dotazů najdete v tématu Omezení požadavků rozhraní API.

Viz také