Syntaxe dotazů Lucene ve službě Azure AI Search

Při vytváření dotazů ve službě Azure AI Search můžete zvolit úplnou syntaxi Analyzátoru dotazů Lucene pro specializované formuláře dotazů: zástupné cardy, přibližné vyhledávání, vyhledávání bezkontaktní komunikace, regulární výrazy. Většina syntaxe analyzátoru dotazů Lucene se v Azure AI Search 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 výraz dotazu a předejte ho pro zástupné čáry, přibližné vyhledávání nebo jeden z dalších formulářů 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í v polích a zvýšení termínu. Hledá hotely, ve kterých pole kategorie obsahuje termín budget. Všechny dokumenty obsahující frázi "recently renovated" jsou seřazené výš v důsledku hodnoty zvýšení hodnoty (3).

POST /indexes/hotels-sample-index/docs/search?api-version=2023-11-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 hledání bezkontaktní komunikace. Při umístění za citovanou frází ~ vyvolá hledání bezkontaktní komunikace. 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í pomocí lexikální analýzy odstraní ~ a přeruší termín business~analyst ve dvou: business NEBO analyst.

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

Zapouzdření speciálních znaků

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

Mezi speciální znaky, které vyžadují zapouzdření, patří:
+ - & | ! ( ) { } [ ] ^ " ~ * ? : \ /

Poznámka:

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 přirozeného jazyka Microsoftu, které zachová slova s dělením slov, 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. Je to například nebezpečný znak, # protože se jedná o identifikátor fragmentu nebo ukotvení v adrese URL. Znak musí být kódován tak, aby %23 byl 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 Search. 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 zadejte logické operátory textu (AND, OR, NOT) ve všech limitech.

Textový operátor Znak Příklad Využití
A + wifi AND luxury Určuje termíny, 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 termínem, aby se vyžadoval. Například stanoví, +wifi +luxury že oba termíny musí být někde v poli jednoho dokumentu.
NEBO (žádný) 1 wifi OR luxury Najde shodu, když se najde některý z termínů. V tomto příkladu dotazovací modul vrátí shodu u dokumentů obsahujících jednu wifi nebo luxury obě. Vzhledem k tomu, ŽE OPERÁTOR OR je výchozí operátor spojení, můžete jej také vynechat, což wifi luxury je ekvivalent .wifi OR luxury
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.

OPERÁTOR NOT Boolean

Důležité

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. Dotaz se například -luxury automaticky rozbalí 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 tak, jako by byly vždy anded 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 Chování
Jednoduchost jakékoliv 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 *.
Stručně vše 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 *.
Úplný jakékoliv 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.
Úplný vše 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 .

Poznámka:

Při použití polí vyhledávacích výrazů nemusíte parametr používat searchFields , protože každý hledaný výraz pole 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í. Dotaz by například search=genre:jazz NOT history&searchFields=description odpovídal jazz pouze genre poli, zatímco by se shodoval NOT history s polem description . 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 searchFields zahrnoutgenre.

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í se dá použít jenom na termíny, ne uvozovky, ale k jednotlivým termínům můžete připojit vlnovku jednotlivě v názvu nebo frázi s více částmi. Například Unviersty~ of~ Wshington~ by se shodoval s University of Washington.

Hledání blízkých výrazů

Hledání bezkontaktní komunikace slouží k vyhledání termínů, které jsou v dokumentu blízko 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 do pěti slov mezi sebou v dokumentu.

Posilování termínu

Zvýšení termínu odkazuje na vyšší hodnocení dokumentu, pokud obsahuje zesílený termín vzhledem k dokumentům, které daný termín neobsahují. To se liší od hodnoticích profilů v těchto bodovacích profilech zvyšuje určité pole, nikoli konkrétní termíny.

Následující příklad ukazuje rozdíly. Předpokládejme, že existuje profil bodování, který zvyšuje shody v určitém poli, řekněme žánr v příkladu musicstoreindex. Zvýšení počtu termínů se dá použít k dalšímu zvýšení určitých hledaných termínů vyšších než jiných. Zvýší například rock^2 electronic dokumenty, které obsahují hledané termíny v poli žánru vyšší než jiná prohledávatelná pole v indexu. Dokumenty, které obsahují horninu hledaného termínu, jsou navíc seřazené výš než ostatní elektronické hledané termíny jako výsledek hodnoty zvýšení termínu (2).

Pokud chcete výraz zvýšit, použijte stříšku , ^symbol se zvýšovacím faktorem (číslo) na konci hledného termínu. Můžete také zvýšit frázi. Čím vyšší je faktor zvýšení, tím relevantnější je termín vzhledem k jiným hledaných termínům. Ve výchozím nastavení je faktor zvýšení skóre 1. I když faktor zvýšení musí být pozitivní, může být menší než 1 (například 0,20).

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 Search je regulární výraz uzavřený mezi lomítky /.

Chcete-li například najít dokumenty obsahující motel nebo hotel, zadejte /[mh]otel/. Hledání regulárních výrazů se shoduje s jedním slovem.

Některé nástroje a jazyky mají nad rámec řídicích pravidel uložených službou Azure AI Search další požadavky na řídicí znak. Pro JSON se řetězce, které obsahují lomítko, umiskutují zpětné lomítko: microsoft.com/azure/ stane se search=/.*microsoft.com\/azure\/.*/ tam, kde search=/.* <string-placeholder>.*/ nastaví regulární výraz a microsoft.com\/azure\/ je řetězec s řídicím lomítkem.

Dva běžné symboly v dotazech regulárních výrazů jsou . a *. Odpovídá . libovolnému jednomu znaku a odpovídá 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í spárovat všechny řady znaků tak .* , aby /be.*/ odpovídaly jakémukoli termínu, který be začíná 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.

Vyhledává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, přípon a přípon.

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

Typ přípony Popis a příklady
Předponu Fragment termínu přichází před * nebo ?. Například výraz dotazu návratu search=alpha*alphanumeric nebo alphabetical. Porovnávání předpon je podporováno v jednoduché i úplné syntaxi.
Přípona Fragment termínu přichází za * nebo ?, s lomítkem k oddělovači konstruktoru. Například search=/.*numeric/ vrátí alphanumeric.
oprava Fragmenty termínů uzavřeny * 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* shody podle 98072-1222 a 98052-1234, kde ? shody u jednoho (povinného) znaku a * shody na znaky libovolné délky, které následují.

Porovnávání přípon vyžaduje oddělovače lomítek / regulárního výrazu. 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 chování * se chová jinak, když se používá mimo dotazy regulárního výrazu. 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.

Poznámka:

Porovnávání vzorů je obvykle pomalé, takže můžete chtít prozkoumat alternativní metody, jako je například tokenizace n-gramu hrany, která vytváří tokeny pro sekvence 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 Částečné hledání termínů a vzorů se speciálními znaky.

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

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

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

Pokud byste použili analyzátor en.lucene (English Lucene), použil by agresivní steming každého termínu. terminateNapříklad , terminationterminates všechny budou tokenizovány dolů na token termi v 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ě en.microsoft analyzer) trochu pokročilejší a používají lemmatizaci místo vytváření. To znamená, že všechny vygenerované tokeny by měly být platná anglická slova. Například terminate, terminatesa termination bude většinou celý v indexu a bude vhodnější pro scénáře, které závisí hodně na zástupných a přibližných vyhledávání.

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

Azure AI Search používá pro textové dotazy hodnocení založené na frekvenci (BM25). U dotazů se zástupnými faktory a dotazy regulárních výrazů, ve kterých může být rozsah termínů potenciálně široký, se však faktor četnosti ignoruje, aby se zabránilo předsudkům při určování shody ze vzácných termínů. Všechny shody se považují za zástupné dokumentace a vyhledávání regulárních výrazů.

Speciální znaky

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

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ě uniknuty (například pro použití řídicí sekvence %E2%9D%A4+). Někteří klienti REST tento překlad dělají automaticky.

Priorita (seskupení)

K vytvoření poddotazů, včetně operátorů v závorkách, můžete použít závorky. Hledá například motel+(wifi|luxury) dokumenty obsahující motel termín nebo wifiluxury (nebo obojí).

Seskupení polí je podobné, ale vymecí seskupování na jedno pole. Například hotelAmenities:(gym+(wifi|pool)) vyhledá pole hotelAmenitiesgym a wifigym nebo nebo a pool.

Omezení velikosti dotazů

Azure AI Search omezuje velikost a složení dotazů, protože nevázané dotazy můžou vaši vyhledávací službu synchronizovat. 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é