Volba jazyka při vytváření fulltextového indexu

platí pro: SQL Server Azure SQL DatabaseAzure SQL Managed Instance

Když vytváříte indexový text s plným textem, určete jazyk na úrovni sloupců pro indexovaný sloupec. Fulltextové dotazy nad sloupcem používají oddělovače slov a stemmery zadaného jazyka. Zvažte, jak Full-Text Engine tokenizuje a pak indexuje váš text při výběru jazyka sloupců.

Poznámka:

Chcete-li zadat jazyk na úrovni sloupce pro sloupec fulltextového indexu, použijte LANGUAGE <language_term> klauzuli při zadávání sloupce. Pro více informací se podívejte na CREATE FULLTEXT INDEX a ALTER FULLTEXT INDEX.

Tato část poskytuje úvod k oddělovačům slov a stemmerům a popisuje, jak Full-Text Search používá identifikátor kódu jazyka (LCID) jazyka definovaného na úrovni sloupce.

Úvod do nástrojů pro oddělování slov a stemmerů

Databázový stroj SQL Serveru obsahuje pro mnoho jazyků ve výchozím nastavení povolené děliče slov a stemmery. Skupina přirozeného jazyka (NLG) společnosti Microsoft implementuje a podporuje tyto lingvistické komponenty. Pro seznam podporovaných jazyků viz sys.fulltext_languages.

Externí komponenty, jako jsou word breakery a filtry, by měly být podepsány pro zvýšení bezpečnosti. Pro ověření podepsání spusťte následující příkaz:

EXECUTE sp_fulltext_service 'verify_signature';

Jak Full-Text Search používá název jazyka na úrovni sloupce

Když vytváříte plnotextový index, zadejte pro každý sloupec platný název jazyka. Pokud je název jazyka platný, ale sys.fulltext_languages katalogový pohled ho nevrátí, Full-Text Search se vrátí k nejbližšímu dostupnému názvu jazyka ze stejné jazykové rodiny, pokud vůbec existuje. V opačném případě fulltextové vyhledávání použije neutrální dělič slov. Aby se tomuto záložnímu chování předešlo, zadejte platný a dostupný název jazyka.

Poznámka:

LCID se používá pro všechny datové typy, které mají nárok na fulltextové indexování (například znak nebo nchar). Pokud máte pořadí řazení sloupce typu char, varchar nebo text nastaveno na jazykové nastavení, které se liší od jazyka identifikovaného LCID, použije se kód LCID stejně během indexování fulltextu a dotazování těchto sloupců.

Dělení slov

Oddělovač slov tokenizuje indexovaný text na hranicích slov, jež jsou specifické pro daný jazyk. Proto se způsob dělení slov v různých jazycích liší. Pokud používáte jeden jazyk, xmůžete indexovat několik jazyků {x, ya z}, některé chování může způsobit neočekávané výsledky. Například pomlčka (-) nebo čárka (,) může být prvek zlomu slova, který je v jednom jazyce vyhozen, ale v jiném ne. Vzácně se může objevit nečekané chování při vzniku původu, protože dané slovo může v různých jazycích pocházet odlišně. Například v anglickém jazyce jsou hranice slov obvykle prázdné znaky nebo nějaká forma interpunkce. V jiných jazycích, například němčině, mohou být slova nebo znaky kombinovány. Jazyk na úrovni sloupce, který zvolíte, by proto měl představovat jazyk, který očekáváte uložit do řádků daného sloupce.

Západní jazyky

Pro západní skupinu jazyků platí, že pokud si nejste jistí, které jazyky se budou ve sloupci ukládat, nebo pokud předpokládáte, že se v něm bude ukládat více než jeden jazyk, obecným náhradním řešením je použít nástroj pro dělení slov pro nejsložitější jazyk, který by se mohl v daném sloupci ukládat.

Můžete například očekávat, že do jednoho sloupce uložíte obsah v angličtině, španělštině a němčině. Tyto tři západní jazyky mají podobná pravidla pro dělení slov, přičemž německá pravidla jsou nejsložitější. Proto je v tomto případě dobrou volbou použít německý word breaker, který dokáže správně zpracovávat anglický i španělský text. Naproti tomu anglický dělič slov nemusí německý text zpracovávat zcela správně kvůli německým složeným slovům.

Použití oddělovače slov nejsložitějšího jazyka v rodině jazyků nezaručuje dokonalé indexování každého jazyka v rodině. Mohou existovat okrajové případy, kdy ani nejpokročilejší algoritmus pro dělení slov nedokáže správně zpracovat text napsaný v jiném jazyce.

Ne-západní jazyky

U ne-západních jazyků (jako čínština, japonština, hindština a podobně) předchozí obcházení nemusí nutně fungovat, z jazykových důvodů. U ne-západních jazyků zvažte jedno z následujících řešení:

  • Pro jazyky z různých jazykových rodin

    Pokud sloupec může obsahovat výrazně odlišné jazyky, například španělštinu a japonštinu, zvažte uložení obsahu různých jazyků do samostatných sloupců. Toto oddělení vám umožňuje použít pro každý sloupec dělič slov specifický pro daný jazyk. Pokud zvolíte toto řešení a v době dotazu neznáte dotazovací jazyk, možná budete muset dotaz vydat pro oba sloupce, abyste zajistili, že dotaz najde správný řádek nebo dokument.

  • Pro binární obsah (například dokumenty Microsoft Word)

    Pokud je indexovaný obsah binárního typu, filtr Full-Text Search, který zpracovává textový obsah před odesláním word breakeru, může respektovat specifické jazykové tagy v binárním souboru. V tomto případě filtr v době indexování vygeneruje správný identifikátor LCID pro dokument nebo oddíl dokumentu. Modul Full-Text potom zavolá oddělovač slov pro jazyk s tímto identifikátorem LCID. Po indexování vícejazyčného obsahu však ověřte, že byl obsah správně indexován.

  • Pro obsah ve formátu prostého textu

    Pokud je obsah prostým textem, můžete ho převést na datový typ XML a přidat jazykové značky, které označují jazyk odpovídající každému konkrétnímu dokumentu nebo oddílu dokumentu. Aby to ale fungovalo, musíte před indexováním fulltextu znát jazyk.

Stemming

Dalším aspektem při výběru jazyka pro jednotlivé sloupce je stemming. Stemming ve fulltextových dotazech je proces vyhledávání všech kmenových (flektivních) tvarů slova v konkrétním jazyce. Když ke zpracování několika jazyků použijete obecný rozdělovač slov, proces stemování funguje pouze pro jazyk zadaný pro daný sloupec, nikoli pro ostatní jazyky v tomto sloupci. Například německé stemmery nefungují pro angličtinu ani španělštinu (a tak dále). Toto chování může ovlivnit vaši paměť v závislosti na tom, jaký jazyk si zvolíte v době dotazu.

Dalším aspektem výběru jazyka je způsob znázornění dat. U dat, která nejsou uložená ve sloupci varbinary(max), se neprovádí žádné speciální filtrování. Spíše text obvykle prochází komponentou pro dělení slov beze změny.

Také děliče slov jsou navrženy především pro zpracování psaného textu. Pokud váš text obsahuje značkování (například HTML), jazyková přesnost při indexování a vyhledávání může být snížena. V takovém případě máte dvě možnosti: preferovanou metodou je uložit textová data do varbinárního (max) sloupce a označit typ dokumentu, aby mohl být filtrován. Pokud tento přístup nepřipadá v úvahu, zvažte použití neutrálního děliče slov a případně přidání značek (například „br“ v HTML) do seznamů rušivých slov.

Poznámka:

Stemming založený na jazyce se nepoužije, pokud zadáte neutrální jazyk.

Zadejte nevýchozí jazyk na úrovni sloupců v plnotextovém dotazu

Ve výchozím nastavení Database Engine Full-Text Search analyzuje dotazovací výrazy pomocí jazyka určeného pro každý sloupec v celotextové klauzuli. Chcete-li toto chování změnit, zadejte při dotazu jiný než výchozí jazyk. U podporovaných jazyků, jejichž jazykové prostředky jsou nainstalovány, lze pomocí klauzule LANGUAGE <language_term> v dotazu CONTAINS, CONTAINSTABLE, FREETEXT nebo FREETEXTTABLE určit jazyk používaný pro dělení slov, odvozování slovních tvarů, tezaurus a zpracování stopslov termínů dotazu.