Syntaxe dotazů Lucene v Azure Cognitive Search

Při vytváření dotazů se můžete rozhodnout pro syntaxi analyzátoru dotazů Lucene pro specializované formuláře dotazů: zástupné znaky, vyhledávání přibližných shod, vyhledávání bezkontaktní výrazy, regulární výrazy. Velká část syntaxe analyzátoru dotazů Lucene je v systému Azure Cognitive Search, s výjimkou hledání v rozsahu, která jsou vytvořena prostřednictvím $filter výrazů.

Pokud chcete použít úplnou syntaxi Lucene, nastavíte queryType na "full" a předáte výraz dotazu se zástupným znakem, vyhledávání přibližných shod nebo jeden z ostatních formulářů dotazů podporovaných úplnou syntaxí. V REST se výrazy dotazů poskytují v parametru požadavku Prohledat dokumenty search (REST API).

Příklad (úplná syntaxe)

Následující příklad je požadavek na vyhledávání vytvořený pomocí úplné syntaxe. Tento konkrétní příklad ukazuje hledání v polích a zvyšování termínů. Hledá hotely, kde pole kategorie obsahuje termín "budget". Všechny dokumenty obsahující frázi "recently zahodí" jsou v důsledku výrazu boost value (3) seřazeny na vyšší místo.

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

I když není specifický pro žádný typ dotazu, searchMode parametr je v tomto příkladu relevantní. Vždy, když jsou v dotazu operátory, měli byste obecně nastavit , abyste zajistili, že budou searchMode=all splněna všechna kritéria.

Další příklady najdete v příkladech syntaxe dotazů Lucene. Podrobnosti o požadavku dotazu a parametrech, včetně vlastnosti searchMode, najdete v tématu Hledání dokumentů (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 pouze jiný znak v řetězci.

Například v úplné syntaxi Lucene se vlnovka (~) používá pro vyhledávání přibližných shod i vyhledávání bezkontaktní blízkosti. Při umístění za frázi v uvozovce vyvolá ~ vyhledávání bezkontaktní blízkosti. Při umístění na konec výrazu vyvolá ~ přibližné vyhledávání.

V rámci termínu, například "business~analyst", se znak nevyhodnocuje jako operátor. Za předpokladu, že se jedná o dotaz na termín nebo frázi, v tomto případě fulltextové vyhledávání pomocí lexikální analýzy vyjme ~ a rozdělí pojem "obchodní~analytik" do dvou: obchodního analytika NEBO analytika.

Výše uvedený příklad je tilda (~), ale stejný princip platí pro každý operátor.

Uchytění speciálních znaků

Pokud chcete použít kterýkoli z vyhledávacích operátorů jako součást hledače textu, řídicí znak před něj zadejte jako předponu jedno zpětné lomítko ( \ ). Například pro vyhledávání pomocí zástupných znaků v https:// , kde je součástí řetězce :// dotazu, zadáte search=https\:\/\/* . Vzor telefonních čísel s uvozeným číslem může vypadat podobně jako \+1 \(800\) 642\-7676 tento.

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

Poznámka

I když uchytáte tokeny pohromadě, lexikální analýza během indexování je může vyrušovat. Standardní analyzátor Lucene například naruší slova na spojovníkech, prázdných a dalších znacích. Pokud v řetězci dotazu požadujete speciální znaky, budete možná potřebovat analyzátor, který je v indexu zachová. Mezi možnosti patří analyzátory přirozeného jazykaspolečnosti Microsoft, které zachovávají slova s pomlčkami, nebo vlastní analyzátor pro složitější vzory. Další informace najdete v tématu Částečné termíny, vzory a speciální znaky.

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

Ujistěte se, že jsou všechny nebezpečné a vyhrazené znaky kódované v adrese URL. Například #je nebezpečný znak, protože se jedná o identifikátor fragmentu/ukotvení v adrese URL. Znak musí být zakódovaný na %23 , pokud se používá v adrese URL. '&' a '=' jsou příklady vyhrazených znaků při oddělování parametrů a zadávání hodnot v Azure Cognitive Search. Další podrobnosti najdete v dokumentu 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ě operátorů znaků i textové operátory. Vždy zadejte textové logické operátory (AND, OR, NOT) na všechna omezení.

Textový operátor Znak Příklad Využití
A &, + wifi + luxury Určuje termíny, které musí shoda obsahovat. V tomto příkladu bude dotazovací modul hledat dokumenty, které obsahují i wifi luxury . Znak plus ( + ) se používá pro požadované termíny. Například stanovuje, +wifi +luxury že oba termíny musí být někde v poli jednoho dokumentu.
NEBO | wifi | luxury Vyhledá shodu, když se najde který z těchto termínů. V tomto příkladu dotazovací modul vrátí shodu u dokumentů, které obsahují nebo wifi luxury obojí. Vzhledem k tomu, že operátor OR je výchozí operátor konjunkce, můžete ho také opustit, což je wifi luxury ekvivalent wifi | luxury operátoru .
NOT !, - wifi –luxury Vrátí shody u dokumentů, které tento termín vylučují. Bude například wifi –luxury hledat dokumenty, které mají wifi termín , ale ne luxury .

Parametr v požadavku dotazu určuje, jestli je termín s operátorem NOT anded nebo ORed s jinými termíny v dotazu (za předpokladu, že pro ostatní termíny neexistuje žádný searchMode + operátor nebo | ). Platné hodnoty zahrnují any nebo all .

searchMode=any zvyšuje odvolání dotazů zahrnutím dalších výsledků a ve výchozím nastavení se - interpretuje jako "NEBO NOT". Bude například odpovídat dokumentům, které obsahují termín nebo dokumenty, wifi -luxury které neobsahují termín wifi luxury .

searchMode=all zvyšuje přesnost dotazů zahrnutím menšího počtu výsledků a ve výchozím nastavení se interpretuje jako "A NOT". Bude například odpovídat wifi -luxury dokumentům, které obsahují termín a wifi neobsahují termín "luxusní". To je pravděpodobně intuitivnější chování - operátoru. Proto byste měli zvážit použití příkazu místo , pokud chcete optimalizovat hledání místo souvzpomínky, a uživatelé při hledání často používají searchMode=all searchMode=any operátor - .

Při rozhodování o nastavení zvažte vzorce interakce uživatelů searchMode pro dotazy v různých aplikacích. U uživatelů, kteří hledají informace, je pravděpodobnější, že do dotazu zahrnou operátora, a ne weby elektronického obchodování s více integrovanými navigačními strukturami.

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

  • genre:baj NOT history

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

Nezapomeňte do uvozovek umístit více řetězců, pokud chcete, aby se oba řetězce vyhodnotili jako jedna entita, v tomto případě hledání dvou různých malířů v artists terénu.

Pole zadané v fieldName:searchExpression musí být searchable pole. Podrobnosti o použití atributů indexu v definicích polí najdete v tématu Vytvoření indexu.

Poznámka

Při použití hledaných výrazů v polích není nutné používat parametr , protože každý vyhledávací výraz v poli má explicitně zadaný searchFields název pole. Přesto můžete použít parametr , pokud chcete spustit dotaz, ve kterém jsou některé části vymezeny na konkrétní pole, a zbytek může platit searchFields pro několik polí. Dotaz by se například search=genre:jazz NOT history&searchFields=description jazz shoduje pouze s genre polem, zatímco NOT history dotaz by odpovídal description poli . Název pole, který je zadán v , má vždy přednost před parametrem , což je důvod, proč v tomto příkladu nemusíme do fieldName:searchExpression searchFields genre parametru searchFields zahrnovat .

Vyhledávání přibližných shod vyhledá shodu v pojmech, které mají podobnou konstrukci, a rozšiřuje termín až do maximálního počtu 50 termínů, které splňují kritéria vzdálenosti dvou nebo menších. Další informace najdete v tématu Přibližné vyhledávání.

Pokud chcete provést přibližné vyhledávání, použijte symbol tildy "~" 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" vrátí "blue", "blues" a "glue".

Vyhledávání přibližných shod lze použít pouze u termínů, nikoli frází, ale můžete k jednotlivým termínům připojit vlnovku jednotlivě v názvu nebo frázi s více částmi. Například "Unviersty~ of~ "Wshhvězdy~" by se shoduje na University of Washington.

Vyhledávání bezkontaktní blízkosti se používá k vyhledání termínů, které jsou v dokumentu blízko sebe. Na konec fráze vložte symbol tildy "~" následovaný počtem slov, která vytvářejí hranici blízkosti. V dokumentu "hotel airport"~5 například najde termíny "hotel" a "airport" (letiště) v 5 slovech.

Zlepšování termínů

Výrazem boosting se rozumí hodnocení dokumentu na vyšší úrovni, pokud obsahuje posílený termín vzhledem k dokumentům, které tento termín neobsahují. To se liší od hodnoticích profilů v tom, že bodovací profily zlepšují určitá pole, nikoli konkrétní termíny.

Následující příklad ilustruje rozdíly. Předpokládejme, že existuje profil vyhodnocování, který zvyšuje shodu v určitém poli, řekněme jako Žánr v musicstoreindex příkladu. Za účelem dalšího zvýšení úrovně hledaného výrazu, který je vyšší než jiné, se dá použít zvyšování skóre termínu. Například rock^2 electronic bude zvyšovat dokumenty, které obsahují hledané výrazy v poli žánru, vyšší než jiná hledaná pole v indexu. V důsledku hodnoty zvýšení skóre (2) jsou dokumenty, které obsahují hledaný výraz Rock , řazeny vyšší než jiné hledané podmínky elektronického výrazu.

Chcete-li zvýšit pojem, použijte blikající kurzor "^", symbol s faktorem zvýšení (číslo) na konci hledaného výrazu. Můžete také posílit fráze. Čím vyšší je faktor zvýšení, tím důležitější je, že výraz bude relativní vzhledem k ostatním hledaným podmínkám. Ve výchozím nastavení je faktor zvýšení 1. I když faktor zvýšení musí být kladný, může být menší než 1 (například 0,20).

Hledání regulárního výrazu vyhledá shodu na základě vzorů, které jsou platné v rámci Apache Lucene, jak je uvedeno ve třídě RegExp. V Azure Kognitivní hledání je regulární výraz uzavřený mezi lomítky / .

Pokud například chcete 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 ukládají další požadavky na řídicí znaky. V případě JSON jsou řetězce, které obsahují lomítko, uvozeny zpětným lomítkem: "microsoft.com/azure/" se změní search=/.*microsoft.com\/azure\/.*/ search=/.* <string-placeholder>.*/ regulární výraz a jedná se o microsoft.com\/azure\/ řetězec s řídicím lomítkem.

Můžete použít obecně rozpoznanou syntaxi pro hledání zástupných znaků vícenásobného () * nebo Single ( ? ). Úplná syntaxe Lucene podporuje prefix, vpony a příponu.

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

Typ připojení Popis a příklady
směr Fragment doby předchází * nebo ? . Například výraz dotazu search=alpha* vrátí "alfanumerický" nebo "abecední". Shoda předpony je podporována v jednoduché i úplné syntaxi.
auditování Fragment platnosti je po * nebo ? s lomítkem k vymezení konstrukce. Například search=/.*numeric./ vrátí "alfanumerické".
vpony Fragmenty termínů jsou uzavřeny * nebo ? . Například search=/.non*al./ vrátí "nenumerické" a "nesmyslná".

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

Shoda přípony a vpony vyžaduje oddělovače předávaného lomítka regulárního výrazu / . Obecně platí, že při psaní kódu nemůžete použít * nebo? symbol jako první znak podmínky nebo v rámci období bez / . V některých nástrojích, jako je například post nebo Azure Portal, je vestavěný uvozovací modul a často můžete spustit dotaz bez oddělovače.

Poznámka

Porovnávání vzorů je jako pravidlo pomalé, takže byste mohli chtít prozkoumat alternativní metody, jako je například Edge n-gram, který vytváří tokeny pro sekvence znaků v termínu. U n-gramů tokenizace bude index větší, ale dotazy mohou být provedeny rychleji, v závislosti na konstrukci vzoru a délce indexovaných řetězců.

Dopad analyzátoru na zástupné dotazy

Během analýzy dotazů jsou dotazy, které jsou formulované jako předpona, přípona, zástupný znak nebo regulární výrazy, předány tak, jak jsou do stromu dotazu, obcházení lexikální analýzy. Shody budou nalezeny pouze v případě, že index obsahuje řetězce ve formátu, který určuje dotaz. Ve většině případů budete během indexování potřebovat analyzátor, který zachová integritu řetězce, aby bylo úspěšné porovnávání částečného a vzorového kódu. Další informace najdete v tématu částečné hledání ve službě Azure kognitivní hledání dotazy.

Vezměte v úvahu situaci, kdy budete chtít, aby vyhledávací dotaz "terminat *" vracel výsledky, které obsahují podmínky jako "ukončení", "ukončení" a "ukončení".

Pokud byste chtěli použít analyzátor en. Lucene (English Lucene), uplatní se tím agresivní lemmatizátor každého období. Například "ukončení", "ukončení", "ukončení" budou v indexu vyraženy do tokenu ' terms '. Na druhé straně se neanalyzují všechny výrazy v dotazech využívajících zástupné znaky nebo přibližné vyhledávání. proto by nedocházelo k žádným výsledkům, které by odpovídaly dotazu "terminat *".

Na druhé straně analyzátory Microsoftu (v tomto případě je to v tomto případě en. Microsoft Analyzer) trochu pokročilejší a používají lemmatizátor nebo předzpracování místo odvozování. To znamená, že všechny vygenerované tokeny by měly být platná anglická slova. Například klíčové slovo "ukončit", "ukončeno" a "ukončení" většinou zachová celý index a může být vhodnější pro scénáře, které jsou závislé na zástupných znacích a přibližném vyhledávání.

Vyhodnocování zástupných znaků a dotazů Regex

Azure Kognitivní hledání používá pro textové dotazy hodnocení založené na kmitočtech (TF-IDF). U dotazů se zástupným znakem a regulárních výrazů, u kterých může být obor pojmů potenciálně rozsáhlý, se ale četnost frekvencí ignoruje, aby nedocházelo k tomu, aby se zabránilo vyřazení shody směrem k Všechny shody jsou zpracovány stejně pro hledání pomocí zástupných znaků a Regex.

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í).

Seskupení polí je podobné, ale obor seskupení do jednoho pole. Například hotelAmenities:(gym+(wifi|pool)) vyhledá pole "hotelAmenities" pro "posilovně" a "WiFi" nebo "posilovně" a "Pool".

Omezení velikosti dotazů

Existuje omezení velikosti dotazů, které můžete odeslat do služby Azure Kognitivní hledání. Konkrétně můžete mít maximálně 1024 klauzulí (výrazy oddělené a, nebo a tak dále). Velikost jakéhokoli jednotlivého výrazu v dotazu je také omezena na přibližně 32 KB. Pokud vaše aplikace generuje vyhledávací dotazy programově, doporučujeme ji navrhovat takovým způsobem, že negeneruje dotazy na neohraničenou velikost.

Viz také