Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Díky fulltextovému vyhledávání v SQL Serveru a Azure SQL Database můžou uživatelé a aplikace spouštět fulltextové dotazy do znakových dat v tabulkách SQL Serveru.
Zásadní změny v SQL Serveru 2025
SQL Server 2025 (17.x) zavádí zásadní změny Full-Text Hledání.
Další informace najdete tady:
Základní úkoly
Tento článek poskytuje přehled o Full-Text Vyhledávání a popisuje jeho komponenty a architekturu. Pokud chcete začít hned, tady jsou základní úkoly.
- Začínáme s Full-Text vyhledáváním
- Vytváření a správa katalogů Full-Text
- Vytváření a správa fulltextových indexů
- naplnění indexů Full-Text
- dotaz pomocí hledání Full-Text
Full-Text Search je volitelná součást databázového stroje SQL Serveru. Pokud při instalaci SQL Serveru nevyberete fulltextové vyhledávání, můžete jej později přidat opětovným spuštěním Instalačního programu.
Přehled
Fulltextový index obsahuje jeden nebo více sloupců založených na znakech v tabulce. Tyto sloupce můžou mít libovolný z následujících datových typů: char, varchar, nchar, nvarchar, text, ntext, image, xml nebo varbinary(max) a FILESTREAM. Každý fulltextový index indexuje jeden nebo více sloupců z tabulky a každý sloupec může používat určitý jazyk.
Fulltextové dotazy provádějí lingvistické vyhledávání textových dat v fulltextových indexech tím, že pracují se slovy a frázemi na základě pravidel určitého jazyka, jako je angličtina nebo japonština. Dotazy v plném textu mohou obsahovat základní slova a fráze nebo více forem slova či fráze. Fulltextový dotaz vrátí všechny dokumenty, které obsahují aspoň jednu shodu (označuje se také jako hit). Shoda nastane, když cílový dokument obsahuje všechny termíny zadané v fulltextovém dotazu a splňuje všechny ostatní podmínky hledání, jako je vzdálenost mezi odpovídajícími termíny.
Fulltextové vyhledávací dotazy
Po přidání sloupců do fulltextového indexu můžou uživatelé a aplikace spouštět fulltextové dotazy na text ve sloupcích. Tyto dotazy můžou hledat některou z následujících podmínek:
- Jedno nebo více konkrétních slov nebo frází (jednoduchý termín)
- Slovo nebo frázi, kde slova začínají zadaným textem (termín předpony)
- Inflexní formy konkrétního slova (termín generování)
- Slovo nebo fráze blízko jiného slova nebo fráze (proximální termín)
- Synonymní formy určitého slova (tesaurus)
- Slova nebo fráze používající vážené hodnoty (vážený termín)
Fulltextové dotazy nerozlišují malá a velká písmena. Například hledání Aluminum nebo aluminum vrátí stejné výsledky.
Fulltextové dotazy používají malou sadu Transact-SQL predikátů (CONTAINS a FREETEXT) a funkcí (CONTAINSTABLE a FREETEXTTABLE). Cíle hledání daného obchodního scénáře však ovlivňují strukturu fulltextových dotazů. Například:
Vyhledání produktu na webu elektronického obchodování:
SELECT product_id FROM products WHERE CONTAINS ((product_description), '"Snap Happy 100EZ" OR FORMSOF(THESAURUS,"Snap Happy") OR "100EZ"') AND product_cost < 200;Vyhledání uchazečů o zaměstnání, kteří mají zkušenosti s prací s SQL Server:
SELECT candidate_name, SSN FROM candidates WHERE CONTAINS ((candidate_resume), '"SQL Server"') AND candidate_division = 'DBA';
Další informace najdete v tématu Dotaz s vyhledáváním Full-Text.
Porovnání Full-Text vyhledávacích dotazů s predikátem LIKE
Na rozdíl od fulltextového vyhledávání funguje predikát LIKE Transact-SQL pouze na vzorech znaků. Predikát také nemůžete použít LIKE k dotazování na formátovaná binární data. Kromě toho LIKE je dotaz na velké množství nestrukturovaných textových dat mnohem pomalejší než ekvivalentní fulltextový dotaz na stejná data. Dotaz LIKE na miliony řádků textových dat může trvat několik minut, než se vrátí. Naopak dotaz v plném textu může trvat pouze několik sekund nebo méně vůči stejným datům, v závislosti na počtu vrácených řádků.
Architektura vyhledávání Full-Text
Architektura fulltextového vyhledávání se skládá z následujících procesů:
Proces SQL Serveru (
sqlservr.exe).Proces hostitele démonu filtru (
fdhost.exe).Z bezpečnostních důvodů načítá filtry a word breakery samostatný proces nazývaný filter daemon host. Proces
fdhost.exeje vytvořen službou FDHOST launcher (MSSQLFDLauncher). Běží pod bezpečnostními přihlašovacími údaji účtu FDHOST launcher service. Proto musí služba spouštěče FDHOST běžet, aby fungovalo fulltextové indexování a fulltextové dotazování. Pro informace o nastavení servisního účtu pro tuto službu viz Nastavit servisní účet pro plnotextový Filter Daemon Launcher.
Tyto dva procesy obsahují komponenty architektury fulltextového vyhledávání. Následující obrázek shrnuje tyto komponenty a jejich vztahy. Komponenty jsou popsány za obrázkem.
Proces SQL Serveru
Proces Database Engine používá následující komponenty pro vyhledávání v plném textu:
| Součást | Popis |
|---|---|
| Uživatelské tabulky | Tyto tabulky obsahují data, která mají být plnotextově indexována. |
| Fulltextový indexovací modul | Modul pro shromažďování fulltextu pracuje s vlákny procházení fulltextu. Zodpovídá za plánování a řízení populace fulltextových indexů a také za monitorování fulltextových katalogů. |
| Soubory Tesaurus | Tyto soubory obsahují synonyma hledaných termínů. Další informace najdete v tématu Konfigurace a správa souborů tesaurus pro Full-Text hledání. |
| Objekty zastavovacího seznamu | Objekty stoplist obsahují seznam běžných slov, která nejsou užitečná pro hledání. Další informace najdete v článku Konfigurace a správa vylučovaných slov a seznamů vylučovaných slov pro fulltextové vyhledávání. |
| Database Engine query processor | Procesor dotazů zkompiluje a spouští dotazy SQL. Pokud dotaz SQL obsahuje fulltextový vyhledávací dotaz, odešle se dotaz do modulu Full-Text, a to jak během kompilace, tak během provádění. Výsledek dotazu se porovná s fulltextovým indexem. |
| motorFull-Text | Full-Text Engine v Database Engine je plně integrován s procesorem dotazů. Modul Full-Text zkompiluje a spouští fulltextové dotazy. V rámci provádění dotazů může modul Full-Text přijímat vstupy z teauru a seznamu stop. |
| Zapisovač indexu (indexer) | Zapisovač indexu sestaví strukturu, která se používá k ukládání indexovaných tokenů. |
| Správce filtrovacího démona | Správce démona filtru zodpovídá za monitorování stavu démona filtru modulu Full-Text. |
Filtrování procesu hostitele démona
Hostitel démon filtru je proces, který spouští modul Full-Text. Spustí následující komponenty fulltextového vyhledávání, které zodpovídají za přístup k datům z tabulek, filtrování a dělení slov, jakož i za dělení slov a odvozování kořenů zadaného dotazu.
Součásti hostitele démona filtru jsou následující:
| Součást | Popis |
|---|---|
| Obslužná rutina protokolu | Tato komponenta načítá data z paměti pro další zpracování a přistupuje k datům z tabulky uživatele v zadané databázi. Jednou z jeho povinností je shromažďovat data ze sloupců, které jsou indexovány v plném textu, a předat je hostiteli filtračního démona, který podle potřeby aplikuje filtrování a rozbíjení slov. |
| Filtry | Některé datové typy vyžadují filtrování před tím, než lze data v dokumentu indexovat v plném textu. Tyto datové typy zahrnují data ve sloupcích varbinary(max),image nebo xml . Filtr použitý pro daný dokument závisí na typu dokumentu. Například různé filtry se používají pro dokumenty Microsoft Wordu (.doc), dokumenty Microsoft Excelu (.xls) a dokumenty XML (.xml). Filtr extrahuje části textu z dokumentu, odstraňuje vložené formátování a zachovává text a případně i informace o pozici textu. Výsledkem je datový proud textových informací. Pro více informací viz Konfigurace a správa filtrů. |
| Dělitelé slov a stemmy | Rozdělovač slov je jazykově specifická komponenta, která určuje hranice slov na základě lexikálních pravidel daného jazyka (dělení slov). Každý modul pro dělení slov je přidružen k komponentě stemmer specifické pro jazyk, která konjuguje slovesa a provádí inflexní rozšíření. V době indexování používá hostitel démon filtru k provádění lingvistické analýzy textových dat z daného sloupce tabulky dělení slov a stemmer. Jazyk přidružený ke sloupci tabulky v fulltextovém indexu určuje, který oddělovač slov a stemmer se používají k indexování sloupce. Další informace najdete v tématu Konfigurace a správa oddělovačů slov a stemmerů. |
SQL Server 2012 (11.x) instaluje novou verzi rozpoznávačů slov a lemmatizérů pro angličtinu v USA (LCID 1033) a angličtinu ve Spojeném království (LCID 2057). Pokud ale chcete zachovat předchozí chování, můžete přepnout na předchozí verzi těchto komponent. Další informace najdete v článku Změna oddělovače slov používaného pro americkou angličtinu a britskou angličtinu.
Zpracování fulltextového vyhledávání
Fulltextové vyhledávání využívá modul Full-Text. Modul Full-Text má dvě role: pro podporu indexování a pro podporu dotazování.
Proces fulltextového indexování
Když spustíte populaci plného textu (známou také jako crawl), Full-Text Engine posílá velké dávky dat do paměti a informuje hostitele filtru démona. Hostitel filtruje a rozděluje data a převádí data na obrácené seznamy slov. Indexer poté načte převedená data ze seznamů slov, zpracuje je za účelem odstranění stop slov a uloží seznamy slov pro dávku do jednoho nebo více invertních indexů.
Při indexování dat uložených v xml, varbinary(max) nebo sloupci obrázku filtr, který implementuje IFilter rozhraní, extrahuje text na základě určeného formátu souboru pro daná data (například Microsoft Word). V některých případech vyžadují, aby binární data byla zapsána do složky FTData\FilterData , místo aby byla přímo streamována přes paměť.
Při zpracování se shromážděná textová data předávají pomocí nástroje pro dělení slov, aby se text oddělil do jednotlivých tokenů nebo klíčových slov. Jazyk používaný pro tokenizaci je určen na úrovni sloupce nebo lze identifikovat v rámci varbinary(max), image nebo xml dat podle komponenty filtru.
Může být provedeno dodatečné zpracování k odstranění stopwordů a normalizaci tokenů před jejich uložením do fragmentu indexu s plným textem.
Po dokončení naplnění se spustí závěrečný proces sloučení, který spojí fragmenty indexu do jednoho hlavního fulltextového indexu. Výsledkem tohoto procesu je vyšší výkon dotazů, protože pouze hlavní index je potřeba dotazovat místo několika fragmentů indexů a pro hodnocení relevance se můžou použít lepší statistiky bodování.
Proces fulltextového dotazování
Procesor dotazů předá celé textové části dotazu do Full-Text Engine ke zpracování. Engine Full-Text provádí dělení slov a volitelně rozšíření tesauru, stemování a zpracování stopslov (šumových slov). Poté jsou fulltextové části dotazu reprezentovány ve formě operátorů SQL, především jako streamované funkce s hodnotou tabulky (STVFs). Během provádění dotazu tyto STVF přistupují k invertovanému indexu a načítají odpovídající výsledky. Výsledky se v tuto chvíli vrátí klientovi nebo se ještě před vrácením klientovi zpracují.
Architektura fulltextového indexu
Informace v fulltextových indexech používá modul Full-Text ke kompilaci fulltextových dotazů, které mohou rychle hledat v tabulce konkrétní slova nebo kombinace slov. Fulltextový index ukládá informace o významných slovech a jejich umístění v jednom nebo více sloupcích databázové tabulky. Fulltextový index je speciální typ funkčního indexu založeného na tokenech, který je sestaven a udržován modulem Full-Text pro SQL Server. Proces vytváření fulltextového indexu se liší od vytváření jiných typů indexů. Místo vytvoření struktury B-stromu na základě hodnoty uložené v určitém řádku vytvoří modul Full-Text invertovanou, skládanou komprimovanou strukturu indexu na základě jednotlivých tokenů z indexovaného textu. Velikost fulltextového indexu je omezena pouze dostupnými paměťovými prostředky počítače, na kterém je spuštěna instance SQL Serveru.
Počínaje systémem SQL Server 2008 (10.0.x) jsou fulltextové indexy integrované s databázovým strojem, nikoli v systému souborů jako v předchozích verzích SQL Serveru. U nové databáze je katalog s plným textem nyní virtuální objekt, který nepatří do žádné souborové skupiny. Je to pouze logický koncept, který odkazuje na skupinu plných textových indexů. Všimněte si však, že při aktualizaci databáze SQL Server 2005 (9.x) je pro jakýkoli plnotextový katalog obsahující datové soubory vytvořena nová souborová skupina. Další informace naleznete v části Upgrade Full-Text Vyhledávání.
Každá tabulka může obsahovat pouze jeden index v plném textu. Pro vytvoření plnotextového indexu v tabulce musí mít tabulka jediný, jedinečný ne-nulový sloupec. Můžete vytvořit plnotextový index ve sloupcích typu char, varchar, nchar, nvarchar, text, ntext, image, xml a varbinary(max). Když vytvoříte plnotextový index na sloupci, jehož datový typ je varbinary(max),image nebo xml, musíte zadat sloupec typu.
Sloupec typu je sloupec tabulky, do kterého ukládáte příponu souboru (.doc, .pdf.xlsatd.) dokumentu v každém řádku.
Struktura fulltextového indexu
Dobré porozumění struktuře fulltextového indexu vám pomůže pochopit, jak Full-Text modul funguje. V tomto článku se jako ukázková tabulka používá následující výňatek Document tabulky AdventureWorks2025 . Tento výňatek zobrazuje pouze dva sloupce, DocumentID sloupec a Title sloupec a tři řádky z tabulky.
Pro tento příklad předpokládejme, že na sloupci Title byl vytvořen index plného textu.
| Id dokumentu | Titulek |
|---|---|
1 |
Crank Arm and Tire Maintenance |
2 |
Front Reflector Bracket and Reflector Assembly 3 |
3 |
Front Reflector Bracket Installation |
Například následující tabulka, která ukazuje Fragment 1, znázorňuje obsah fulltextového indexu vytvořeného ve Title sloupci Document tabulky. Fulltextové indexy obsahují více informací, než je uvedeno v této tabulce. Tabulka je logická reprezentace fulltextového indexu a je k dispozici pouze pro demonstrační účely. Řádky jsou uložené v komprimovaném formátu pro optimalizaci využití disku.
Data jsou obrácena proti původním dokumentům. K inverzi dochází, protože klíčová slova jsou mapována na ID dokumentu. Z tohoto důvodu se fulltextový index často označuje jako invertovaný index.
Všimněte si také, že klíčové slovo and je odebráno z fulltextového indexu, protože and je to zarážka. Odebrání stopwords z fulltextového indexu může způsobit značné úspory místa na disku, což zlepšuje výkon dotazů. Další informace o slovech ignorovaných při vyhledávání naleznete v tématu Konfigurace a správa slov ignorovaných při vyhledávání a seznamů ignorovaných slov pro fulltextové vyhledávání.
Fragment 1
| Klíčové slovo | Id sloupku | ID dokumentu | Výskyt |
|---|---|---|---|
Crank |
1 | 1 | 1 |
Arm |
1 | 1 | 2 |
Tire |
1 | 1 | 4 |
Maintenance |
1 | 1 | 5 |
Front |
1 | 2 | 1 |
Front |
1 | 3 | 1 |
Reflector |
1 | 2 | 2 |
Reflector |
1 | 2 | 5 |
Reflector |
1 | 3 | 2 |
Bracket |
1 | 2 | 3 |
Bracket |
1 | 3 | 3 |
Assembly |
1 | 2 | 6 |
3 |
1 | 2 | 7 |
Installation |
1 | 3 | 4 |
Sloupec Keyword obsahuje reprezentaci jednoho tokenu extrahovaného v době indexování. Děliče slov určují, co tvoří token.
Sloupec ColId obsahuje hodnotu odpovídající určitému sloupci, který je indexován fulltextem.
Sloupec DocId obsahuje hodnoty pro 8bajtové celé číslo, které se mapuje na určitou hodnotu klíče fulltextového indexu v tabulce, která je indexována pro fulltext. Toto mapování je nezbytné, pokud fulltextový klíč není celočíselný datový typ. V takových případech jsou mapování mezi hodnotami fulltextového klíče a DocId hodnotami udržována v samostatné tabulce nazývané DocId Mapping tabulkou. Pro dotazování na tato mapování použijte systémovou uloženou proceduru sp_fulltext_keymappings. Aby bylo možné vyhovět hledané podmínce, hodnoty z předchozí tabulky DocId musí být spojeny s mapovací tabulkou DocId, aby se načetly řádky z dotazované základní tabulky. Pokud je hodnota fulltextového klíče základní tabulky celočíselným typem, hodnota přímo slouží jako DocId hodnota a není nutné žádné mapování. Proto použití celočíselné hodnoty fulltextových klíčů může pomoct optimalizovat fulltextové dotazy.
Sloupec Occurrence obsahuje celočíselnou hodnotu. Pro každou DocId hodnotu existuje seznam výskytových hodnot, které odpovídají relativním posunům slov konkrétního klíčového slova v rámci tohoto DocId. Hodnoty výskytů jsou užitečné při určování shody frází nebo blízkosti, například fráze mají číselné sousední hodnoty výskytu. Jsou také užitečné při výpočtu skóre relevance. Například počet výskytů klíčového slova v a DocId může být použit při skórování.
Fragmenty fulltextového indexu
Logický fulltextový index je obvykle rozdělen mezi několik interních tabulek. Každá interní tabulka se nazývá fragment fulltextového indexu. Některé z těchto fragmentů můžou obsahovat novější data než jiná. Například pokud uživatel aktualizuje následující řádek, jehož DocId hodnota je 3, a tabulka je automaticky sledována změnami, vytvoří se nový fragment.
| Id dokumentu | Titulek |
|---|---|
3 |
Rear Reflector |
V následujícím příkladu, který ukazuje fragment 2, obsahuje fragment novější data o DocId 3 než fragment 1. Proto když uživatel požádá o Rear Reflector, jsou data z fragmentu 2 použita pro DocId 3. Každý fragment je označen časovým razítkem vytvoření, na které se dá dotazovat pomocí zobrazení katalogu sys.fulltext_index_fragments .
Fragment 2
| Klíčové slovo | Id sloupku | ID dokumentu | Occ |
|---|---|---|---|
Rear |
1 | 3 | 1 |
Reflector |
1 | 3 | 2 |
Jak je vidět z fragmentu 2, fulltextové dotazy musí dotazovat každý fragment interně a zahodit starší položky. Proto příliš mnoho fragmentů ve fulltextovém indexu může vést k podstatnému snížení výkonu dotazů. Pro snížení počtu fragmentů reorganizujte katalog plného textu pomocí REORGANIZE volby ALTER FULLTEXT CATALOG Transact-SQL příkazu. Tento příkaz provede hlavní sloučení, které sloučí fragmenty do jednoho většího fragmentu a odebere všechny zastaralé položky z fulltextového indexu.
Po opětovném uspořádání by ukázkový index obsahoval následující řádky:
| Klíčové slovo | Id sloupku | ID dokumentu | Occ |
|---|---|---|---|
Crank |
1 | 1 | 1 |
Arm |
1 | 1 | 2 |
Tire |
1 | 1 | 4 |
Maintenance |
1 | 1 | 5 |
Front |
1 | 2 | 1 |
Rear |
1 | 3 | 1 |
Reflector |
1 | 2 | 2 |
Reflector |
1 | 2 | 5 |
Reflector |
1 | 3 | 2 |
Bracket |
1 | 2 | 3 |
Assembly |
1 | 2 | 6 |
3 |
1 | 2 | 7 |
Rozdíly mezi fulltextovými indexy a běžnými indexy SQL Serveru
| Fulltextové indexy | Běžné indexy SQL Serveru |
|---|---|
| Pro každou tabulku je povolený pouze jeden fulltextový index. | Pro každou tabulku je povoleno několik běžných indexů. |
| Přidání dat do fulltextových indexů, nazývaných jako populace, může být požadováno buď prostřednictvím plánu, konkrétního požadavku, nebo může dojít k němu automaticky s přidáním nových dat. | Aktualizuje se automaticky, když se data, na kterých jsou založená, vloží, aktualizuje nebo odstraní. |
| Seskupené v rámci stejné databáze do jednoho nebo více fulltextových katalogů. | Není seskupené. |
Lingvistické součásti a jazyková podpora fulltextového vyhledávání
Vyhledávání v plném textu podporuje více než 50 různých jazyků, jako je angličtina, španělština, čínština, japonština, arabština, bengálština a hindština. Úplný seznam podporovaných fulltextových jazyků najdete v sys.fulltext_languages. Každý sloupec v indexu plného textu je přiřazen identifikátoru Microsoft Windows lokality (LCID), který odpovídá jazyku, který fulltextové vyhledávání podporuje. Například LCID 1033 odpovídá americké angličtině a LCID 2057 britské angličtině. Pro každý podporovaný fulltextový jazyk poskytuje Database Engine lingvistické komponenty, které podporují indexování a dotazování plnotextových dat uložených v daném jazyce.
Součásti specifické pro jazyk zahrnují následující položky:
| Součást | Popis |
|---|---|
| Dělitelé slov a stemmy | Oddělovač slov najde hranice slov na základě lexikálních pravidel daného jazyka (dělení slov). Každý oddělovač slov je spojen se stemmerem, který zpracovává slovesa pro tentýž jazyk. Další informace najdete v článku Konfigurovat a spravovat oddělovače slov a stemmery. |
| Seznamy vyloučených slov | Je k dispozici seznam stop systému, který obsahuje základní sadu stopwords (označovaných také jako slova šumu).
Stopword je slovo, které nepomáhá při hledání a je ignorováno fulltextovými dotazy. Například pro anglická národní prostředí slova, jako aje , andis, a the jsou považovány za stopwords. Obvykle potřebujete nakonfigurovat jeden nebo více souborů tesaurus a stoplistů. Další informace najdete v článku Konfigurace a správa stop slov a stoplistů pro fulltextové vyhledávání. |
| Soubory Tesaurus | Database Engine také instaluje soubor tezauru pro každý plnotextový jazyk a globální soubor tezaurusu. Nainstalované soubory tesaurus jsou prázdné, ale můžete je upravit a definovat synonyma pro konkrétní jazyk nebo obchodní scénář. Díky vývoji tesauru přizpůsobeného fulltextovým datům můžete efektivně rozšířit rozsah fulltextových dotazů na tato data. Další informace najdete v tématu Konfigurace a správa souborů tesaurus pro Full-Text hledání. |
| Filtry (IFilters) | Indexování dokumentu ve sloupci s datovým typem varbinary(max), image nebo xml vyžaduje filtr k dalšímu zpracování. Filtr musí být specifický pro typ dokumentu (.doc, .pdf, .xls, .xmlatd.). Pro více informací viz Konfigurace a správa filtrů. |