Jednoduchá syntaxe dotazů v Azure Kognitivní hledání

Azure Kognitivní hledání implementuje dva jazyky dotazů založené na Lucene: jednoduchý analyzátor dotazů a analyzátor dotazů Lucene. Jednoduchý analyzátor je flexibilnější a pokusí se o interpretaci požadavku i v případě, že není dokonale složen. Z důvodu této flexibility je výchozí hodnotou pro dotazy v Azure Kognitivní hledání.

Jednoduchá syntaxe se používá pro výrazy dotazu předané v search parametru žádosti hledání dokumentů (REST API) , a nelze je zaměňovat se syntaxí OData použitými pro $filter $orderby výrazy a v rámci stejné žádosti. Parametry OData mají odlišnou syntaxi a pravidla pro sestavování dotazů, uvozovacích řetězců a tak dále.

I když je jednoduchý analyzátor založený na třídě zjednodušeného analyzátoru dotazů Apache Lucene , implementace v kognitivní hledání vyloučí přibližné hledání. Pokud potřebujete hledání přibližných výsledků, zvažte místo toho alternativní úplnou syntaxi dotazů Lucene .

Příklad (jednoduchá syntaxe)

I když queryType je nastavená níže, je výchozí nastavení a může být vynecháno, pokud se nevrátíte z alternativního typu. Následující příklad je hledání nezávisle za předpokladu, že všechny odpovídající dokumenty zahrnují "Pool".

POST https://{{service-name}}.search.windows.net/indexes/hotel-rooms-sample/docs/search?api-version=2020-06-30
{
  "queryType": "simple",
  "search": "budget hotel +pool",
  "searchMode": "all"
}

searchMode Parametr je v tomto příkladu relevantní. Vždy, když jsou logické operátory na dotazu, byste obecně měli nastavit searchMode=all , aby se zajistilo, že všechna kritéria jsou shodná. V opačném případě můžete použít výchozí searchMode=any , který upřednostňuje odvolání v případě přesnosti.

Další příklady najdete v tématu jednoduché příklady syntaxe dotazů. Podrobnosti o požadavku a parametrech dotazu naleznete v tématu Search Documents (REST API).

Hledání klíčových slov na základě podmínek a frází

Řetězce předané do search parametru mohou zahrnovat výrazy nebo fráze v libovolném podporovaném jazyce, logické operátory, operátory přednosti, zástupný znak nebo znaky předpony pro "začíná dotazy, řídicí znaky a znaky kódování adresy URL. search Parametr je nepovinný. Neurčeno, hledání ( search=* nebo search=" " ) vrátí prvních 50 dokumentů v libovolném (neseřazené) pořadí.

  • Termínem hledání je dotaz na jednu nebo více podmínek, kde některý z podmínek je považován za shodu.

  • Hledání frází je přesná fráze uzavřená v uvozovkách " " . Například při Roach Motel (bez uvozovek) by hledání dokumentů obsahujících Roach a/nebo Motel kdekoli v libovolném pořadí, "Roach Motel" (s uvozovkami), bude odpovídat pouze dokumentům, které obsahují tuto celou frázi společně a v tomto pořadí (lexikální analýza je stále použita).

    V závislosti na vašem klientovi vyhledávání možná budete muset při hledání fráze řídicí uvozovky vymezit. Například v příspěvku v žádosti POST "Roach Motel" by se fráze v textu požadavku zadala jako "\"Roach Motel\"" .

Ve výchozím nastavení se všechny výrazy nebo fráze předané v search parametru podrobují lexikální analýze. Ujistěte se, že rozumíte chování tokenizace analyzátoru, který používáte. V případě neočekávaných výsledků dotazu se často dá důvod trasovat na to, jak jsou výrazy v době dotazu vyvolány.

Libovolný text s jednou nebo více výrazy je považován za platný výchozí bod pro provedení dotazu. Azure Kognitivní hledání bude odpovídat dokumentům, které obsahují některé nebo všechny z těchto podmínek, včetně všech variant zjištěných během analýzy textu.

Stejně jako u těchto zvuků je ve službě Azure Kognitivní hledání jeden aspekt provádění dotazů, které by mohly vést k neočekávaným výsledkům, a ne zmenšení výsledků hledání, protože se do vstupního řetězce přidávají další výrazy a operátory. Bez ohledu na to, zda toto rozšíření skutečně probíhá, závisí na zahrnutí operátoru NOT v kombinaci s searchMode nastavením parametru, které určuje, jak není interpretováno v souvislosti s chováním a nebo nebo. Další informace naleznete v tématu operátor NOT v rámci logických operátorů.

Logické operátory

Můžete vložit logické operátory do řetězce dotazu, aby se zlepšila přesnost shody. V jednoduché syntaxi jsou logické operátory založené na znacích. Operátory textu, jako je například slovo a, nejsou podporovány.

Znak Příklad Využití
+ pool + ocean Operace a. Například pool + ocean stanoví, že dokument musí obsahovat oba výrazy.
| pool | ocean Operace nebo najde shodu, když je nalezen libovolný termín. V tomto příkladu dotazovací stroj vrátí shodu s dokumenty, které obsahují buď pool nebo ocean nebo obojí. Vzhledem k tomu, že nebo je výchozím operátorem spojení, můžete jej také opustit, což pool ocean je ekvivalent pool | ocean .
- pool – ocean Operace NOT vrátí shodu u dokumentů, které vyloučily podmínky.

Chcete-li získat očekávané chování u výrazu NOT, zvažte nastavení searchMode=all v žádosti. V opačném případě se ve výchozím nastavení zobrazí searchMode=any Shoda pool se všemi dokumenty, které neobsahují ocean , což může být mnoho dokumentů. searchMode Parametr v požadavku na dotaz řídí, zda je výraz s operátorem NOT ANDed nebo ORed s jinými podmínkami v dotazu (za předpokladu, že se nejedná + | o operátor nebo na jiné podmínky). Použití searchMode=all zvyšuje přesnost dotazů zahrnutím menších výsledků a ve výchozím nastavení je interpretováno jako "a nikoli".

Při rozhodování o searchMode nastavení zvažte vzory interakce uživatele pro dotazy v různých aplikacích. Uživatelům, kteří hledají informace, je pravděpodobnější, že v dotazu zařadí operátor, a to na rozdíl od webů elektronického obchodování, které mají více integrovaných navigačních struktur.

Dotazy na předpony

Pro "začíná dotazy" přidejte operátor přípon ( * ) jako zástupný symbol pro zbytek období. Aby bylo možné přidat operátor přípon, musí dotaz na předponu začínat alespoň jedním alfanumerickým znakem.

Znak Příklad Využití
* lingui* bude odpovídat "jazyku" nebo "linguini" Hvězdička ( * ) představuje jeden nebo více znaků libovolné délky, ignorování velkých a malých písmen.

Podobně jako filtry, dotaz předpony hledá přesnou shodu. V takovém případě neexistuje žádné bodové hodnocení (všechny výsledky obdrží skóre hledání 1,0). Upozorňujeme, že dotazy s předponou můžou být pomalé, zejména pokud je index velký a předpona obsahuje malý počet znaků. Alternativní metodologie, jako je Edge n-gram, může provádět rychleji.

Jednoduchá syntaxe podporuje pouze porovnání předpon. U přípon nebo vpony, které odpovídají konci nebo polovině podmínky, použijte pro hledání pomocí zástupných znaků úplnou syntaxi Lucene.

Operátory hledání uvozovacích znaků

V jednoduché syntaxi operátory hledání obsahují tyto znaky: + | " ( ) ' \

Pokud je některý z těchto znaků součástí tokenu v indexu, vydejte ho pomocí prefixu s jedním zpětným lomítkem ( \ ) v dotazu. Předpokládejme například, že jste použili vlastní analyzátor pro celou funkci tokenizace a váš index obsahuje řetězec "luxus + hotelu". Chcete-li získat přesnou shodu s tímto tokenem, vložte řídicí znak: search=luxury\+hotel .

Chcete-li zjednodušit věci z více typických případů, existují dvě výjimky z tohoto pravidla, kde není nutné uvozovací znaky:

  • -Pokud se jedná o první znak za prázdným znakem, musí být znak operátoru bez řídicí sekvence. Pokud - se zobrazí uprostřed (například v 3352CDD0-EF30-4A2E-A512-3B30AF40F3FD ), můžete přeskočit uvozovací znaky.

  • Operátor přípona * musí být uvozena řídicím znakem pouze v případě, že se jedná o poslední znak před prázdným znakem. Pokud se * zobrazí uprostřed (například v 4*4=16 ), nevyžaduje se žádné uvozovací znaky.

Poznámka

Ve výchozím nastavení Standard analyzátor odstraní a rozdělí slova na spojovníkech, prázdných znaků, ampersandech a dalších znacích během lexikální analýzy. Pokud vyžadujete, aby v řetězci dotazu zůstaly speciální znaky, budete možná potřebovat analyzátor, který je zachovává v indexu. Mezi možnosti patří analyzátorypřirozeného jazyka od Microsoftu, které zachovává rozdělená slova nebo vlastní analyzátor pro složitější vzory. Další informace najdete v tématu částečné výrazy, vzory a speciální znaky.

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

Zajistěte, aby všechny nebezpečné a vyhrazené znaky byly kódované 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ódovaný na, %23 Pokud je použit v adrese URL. ' & ' a ' = ' jsou příklady rezervovaných znaků, které jsou vymezují parametry a určují hodnoty v Azure Kognitivní hledání. Další informace najdete v tématu RFC1738: Uniform Resource Locators (URL).

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

Speciální znaky

V některých případech můžete chtít vyhledat speciální znak, například ❤ emoji nebo symbol €. V takových případech se ujistěte, že analyzátor, který používáte, nefiltruje tyto znaky. Standardní analyzátor obchází mnoho speciálních znaků a vyloučí je z indexu.

Analyzátory, které budou tokenizovat speciální znaky, zahrnují analyzátor "prázdných", který bere v úvahu všechny sekvence znaků oddělené prázdnými znaky jako tokeny (takže řetězec "❤" by byl považován za token). Také analyzátor jazyka, jako je Microsoft English Analyzer ("en. Microsoft"), by měl jako token přebírat řetězec "€". Můžete otestovat analyzátor a zjistit, jaké tokeny generuje pro daný dotaz.

Při použití znaků Unicode zajistěte, aby byly symboly v adrese URL dotazu správně uvozeny řídicími znaky (například ❤ by používaly řídicí sekvenci %E2%9D%A4+ ). Post provede tento převod automaticky.

Priorita (seskupení)

Pomocí závorek lze vytvořit poddotazy, včetně operátorů v rámci příkazu kulatého závorky. Nástroj například motel+(wifi|luxury) vyhledá dokumenty obsahující termín "Motel" a buď "WiFi", nebo "luxus" (nebo obojí).

Omezení velikosti dotazů

Pokud vaše aplikace generuje vyhledávací dotazy programově, doporučujeme ji navrhovat takovým způsobem, že negeneruje dotazy na neohraničenou velikost.

  • Pro GET nesmí délka adresy URL překročit 8 KB.

  • U POST (a všech ostatních požadavků), kde tělo žádosti zahrnuje search a další parametry, jako jsou filter a orderby , je maximální velikost 16 MB, kde maximální počet klauzulí v search (výrazy oddělené a, nebo a tak dále) je 1024. Velikost jakéhokoli jednotlivého výrazu v dotazu je také omezena na přibližně 32 KB. Další informace najdete v tématu omezení požadavků rozhraní API.

Další kroky

Pokud budete vytvářet dotazy programově, Projděte si text fulltextového vyhledávání v Azure kognitivní hledání , abyste pochopili fáze zpracování dotazů a důsledky analýzy textu.

Další informace o vytváření dotazů najdete v následujících článcích: