Dotaz s využitím vyhledávání Full-Text

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed Instance

Plnotextové dotazy zapisujte pomocí predikátů CONTAINS a FREETEXT a funkcí CONTAINSTABLE a FREETEXTTABLE, které vracejí sadu řádků, v příkazu SELECT. Tento článek obsahuje příklady jednotlivých predikátů a funkcí a pomáhá vám vybrat tu nejlepší, která se má použít.

  • Pro shodu slov a frází použijte CONTAINS a .CONTAINSTABLE
  • Pro sladění významu, ale ne přesného znění použijte FREETEXT a .FREETEXTTABLE

Příklady jednotlivých predikátů a funkcí

Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2025 nebo AdventureWorksDW2025, kterou si můžete stáhnout z domovské stránky Microsoft SQL Serveru pro ukázky a komunitní projekty .

Abyste mohli spouštět ukázkové dotazy, musíte také nastavit Full-Text Vyhledávání. Pro více informací viz Začněte s Full-Text Vyhledáváním.

Příklad: OBSAHUJE

Následující příklad najde všechny produkty s cenou $80.99, které obsahují slovo Mountain:

USE AdventureWorks2025;
GO

SELECT Name,
       ListPrice
FROM Production.Product
WHERE ListPrice = 80.99
      AND CONTAINS ((Name), 'Mountain');
GO

Příklad: FREETEXT

Následující příklad vyhledá všechny dokumenty, které obsahují slova související s vital safety components:

USE AdventureWorks2025;
GO

SELECT Title
FROM Production.Document
WHERE FREETEXT ((Document), 'vital safety components');
GO

Příklad: CONTAINSTABLE

Následující příklad vrací ID popisu a popis všech produktů, pro které sloupec Description obsahuje slovo aluminum v blízkosti slova light nebo slova lightweight. Vráceny jsou pouze řádky s hodnocením vyšším než 2.

USE AdventureWorks2025;
GO

SELECT FT_TBL.ProductDescriptionID,
       FT_TBL.Description,
       KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL
     INNER JOIN CONTAINSTABLE (Production.ProductDescription, Description, '(light NEAR aluminum) OR
      (lightweight NEAR aluminum)') AS KEY_TBL
     ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEY_TBL.RANK DESC;
GO

Příklad: FREETEXTTABLE

Následující příklad rozšiřuje FREETEXTTABLE dotaz tak, aby nejprve vrátil nejlépe hodnocené řádky a přidal pořadí každého řádku do výběrového seznamu. Pro napsání podobného dotazu musíte vědět, že je to ProductDescriptionID unikátní klíčový sloupec tabulky ProductDescription .

USE AdventureWorks2025;
GO

SELECT KEY_TBL.RANK,
       FT_TBL.Description
FROM Production.ProductDescription AS FT_TBL
     INNER JOIN FREETEXTTABLE (Production.ProductDescription, Description, 'perfect all-around bike') AS KEY_TBL
         ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

Tady je rozšíření stejného dotazu, které vrací pouze řádky s pořadím 10 nebo vyšším:

USE AdventureWorks2025;
GO

SELECT KEY_TBL.RANK,
       FT_TBL.Description
FROM Production.ProductDescription AS FT_TBL
     INNER JOIN FREETEXTTABLE (Production.ProductDescription, Description, 'perfect all-around bike') AS KEY_TBL
         ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY]
WHERE KEY_TBL.RANK >= 10
ORDER BY KEY_TBL.RANK DESC;
GO

Shoda slov nebo shodování významu

CONTAINS a CONTAINSTABLE, nebo FREETEXT a , FREETEXTTABLEjsou užitečné pro různé druhy párování. Následující informace vám pomohou vybrat nejlepší predikát nebo funkci pro váš dotaz:

OBSAHUJE a CONTAINSTABLE

  • Porovná jednotlivá slova a fráze s přesnou nebo přibližnou (méně přesnou) shodou.
  • Můžete také provést následující akce:
    • Určete blízkost slov v rámci určité vzdálenosti od sebe.
    • Vrácení vážených shod.
    • Zkombinujte podmínky hledání s logickými operátory. Pro více informací viz Použití Booleových operátorů (AND, OR a NOT) později v tomto článku.

FREETEXT a FREETEXTTABLE

  • Porovná význam, ale ne přesnou formulaci zadaných slov, frází nebo vět (řetězec volného textu).
  • Shody se vygenerují, pokud se v fulltextovém indexu zadaného sloupce najde nějaký termín nebo forma jakéhokoli termínu.

Porovnání predikátů a funkcí

Predikáty CONTAINS nebo FREETEXT a funkce CONTAINSTABLE nebo FREETEXTTABLE, které vracejí sadu řádků, mají odlišnou syntaxi a možnosti. Následující informace vám pomohou vybrat nejlepší predikát nebo funkci pro váš dotaz:

Predikáty CONTAINS a FREETEXT

využití . Použijte fulltextové predikáty CONTAINS a FREETEXT v klauzuli WHERE nebo HAVING příkazu SELECT.

výsledky. Predikáty CONTAINS a FREETEXT vracejí hodnotu TRUE nebo FALSE, která určuje, zda daný řádek odpovídá fulltextovému dotazu. V sadě výsledků se vrátí odpovídající řádky.

Další možnosti. Predikáty můžete kombinovat s libovolným z ostatních predikátů jazyka Transact-SQL, například LIKE a BETWEEN.

Můžete zadat jeden sloupec, seznam sloupců nebo všechny sloupce v tabulce, které se mají prohledávat.

Volitelně můžete zadat jazyk, jehož prostředky používá fulltextový dotaz pro dělení slov a stematizaci, vyhledávání v tezauru a odstranění nadbytečných slov.

Můžete použít čtyřdílné jméno v predikátu CONTAINS or FREETEXT pro dotazování na plnotextové indexované sloupce cílových tabulek na propojeném serveru. Pokud chcete připravit vzdálený server pro příjem fulltextových dotazů, vytvořte fulltextový index cílových tabulek a sloupců na vzdáleném serveru a pak přidejte vzdálený server jako propojený server.

Pro více informací o syntaxi a argumentech těchto predikátů viz CONTAINS a FREETEXT.

Funkce hodnot sady řádků CONTAINSTABLE a FREETEXTTABLE

využití . Použijte fulltextové funkce CONTAINSTABLE a FREETEXTTABLE jako běžný název tabulky v klauzuli FROM příkazu SELECT.

Při použití některé z těchto funkcí musíte zadat základní tabulku, která se má prohledávat. Stejně jako u predikátů můžete zadat jeden sloupec, seznam sloupců nebo všechny sloupce v tabulce, které se mají prohledávat, a volitelně jazyk, jehož prostředky používají daný fulltextový dotaz.

Obvykle musíte spojit výsledky CONTAINSTABLE nebo FREETEXTTABLE se základní tabulkou. Pokud chcete tabulky spojit, musíte znát název jedinečného klíčového sloupce. Tento sloupec, který se vyskytuje v každé tabulce s plným textem, slouží k vynucení unikátních řádků pro tabulku ( sloupec unikátního klíče). Pro více informací o klíčovém sloupci viz Vytvořit a spravovat indexy v plném textu.

výsledky. Tyto funkce vrátí tabulku s nulou, jednou nebo více řádky, které odpovídají fulltextovém dotazu. Vrácená tabulka obsahuje pouze řádky ze základní tabulky, které odpovídají kritériím výběru zadaným v fulltextové hledané podmínce funkce.

Dotazy, které používají jednu z těchto funkcí, také vracejí hodnotu relevance rank (RANK) a full-text key (KEY) pro každý vrácený řádek, a to následovně:

  • KEY sloupek. Sloupec KEY vrací unikátní hodnoty vrácených řádků. Sloupec KEY lze použít k určení kritérií výběru.

  • RANK sloupek. Sloupec RANK vrací hodnotu pořadí pro každý řádek, která ukazuje, jak dobře řádek odpovídal kritériím výběru. Čím vyšší je hodnota pořadí textu nebo dokumentu v řádku, tím relevantnější je řádek pro daný fulltextový dotaz. Různé řádky lze identicky seřadit. Počet shod, které se mají vrátit, můžete omezit zadáním volitelného parametru top_n_by_rank. Pro více informací viz Omezit výsledky vyhledávání podle pořadí.

Pro více informací o syntaxi a argumentech těchto funkcí viz CONTAINSTABLE a FREETEXTTABLE.

Konkrétní typy hledání

Vyhledejte konkrétní slovo nebo frázi (jednoduchý termín)

Můžete použít CONTAINS, CONTAINSTABLE, FREETEXT, nebo FREETEXTTABLE vyhledat v tabulce konkrétní slovo či frázi. Například pokud chcete prohledat tabulku ProductReview v databázi AdventureWorks2025 a najít všechny komentáře k produktu obsahující frázi learning curve, můžete použít predikát CONTAINS následovně:

USE AdventureWorks2025;
GO

SELECT Comments
FROM Production.ProductReview
WHERE CONTAINS ((Comments), '"learning curve"');
GO

Podmínka vyhledávání, v tomto případě learning curve, může být složitá a může být složena z jednoho nebo více členů.

Více informací o vyhledávání jednoduchých termínů

V fulltextovém vyhledávání je slovo (nebo token) řetězec, jehož hranice jsou identifikovány příslušnými slovními děliči podle lingvistických pravidel zadaného jazyka. Platná fráze se skládá z více slov s interpunkčními znaménkami mezi nimi nebo bez nich.

Například je croissant slovo a café au lait je fráze. Slova a fráze jako tato se nazývají jednoduché termíny.

CONTAINS a CONTAINSTABLE hledají přesnou shodu dané fráze. FREETEXT a FREETEXTTABLE rozdělí frázi na jednotlivá slova.

Vyhledejte slovo s předponou (výraz s předponou)

Můžete použít CONTAINS nebo CONTAINSTABLE vyhledávat slova či fráze s určenou předponou. Vrátí se všechny položky ve sloupci, které obsahují text začínající zadanou předponou. Například pro vyhledávání všech řádků obsahujících prefix top-, jako v topple, topping, a top, dotaz vypadá jako následující příklad:

USE AdventureWorks2025;
GO

SELECT Description,
       ProductDescriptionID
FROM Production.ProductDescription
WHERE CONTAINS ((Description), '"top*"');
GO

Veškerý text, který odpovídá textu zadanému před vrácením hvězdičky (*). Pokud text a hvězdička nejsou ohraničeny dvojitými uvozovkami, jako v CONTAINS (DESCRIPTION, 'top*'), vyhledávání v plném textu nepovažuje hvězdičku za divokou kartu.

Pokud je termín předpony frází, každý token, který tvoří frázi, se považuje za samostatný termín předpony. Všechny řádky, které obsahují slova začínající předponou, se vracejí. Například předponový člen light bread* najde řádky s textem light breaded, lightly breaded, nebo light bread, ale nevrátí lightly toasted bread.

Více informací o vyhledávání podle prefixů

Předpona označuje řetězec, který je umístěn před slovem, aby vytvořil odvozeninu nebo tvar skloňování.

  • Pro jeden prefixový termín je každé slovo začínající daným termínem součástí výsledné množiny. Například člen auto* odpovídá automatic, automobile, a tak dále.

  • Pro frázi se každé slovo v rámci fráze považuje za předponu termínu. Například výraz auto tran* odpovídá automatic transmission a automobile transducer, ale neodpovídá automatic motor transmission.

Vyhledávání podle předpony je podporováno CONTAINS a CONTAINSTABLE.

Hledejte flexivní tvary konkrétního slova (generační termín)

Můžete použít CONTAINS, CONTAINSTABLE, FREETEXT nebo FREETEXTTABLE k vyhledávání všech různých časů a konjugací slovesa nebo tvarů podstatného jména v jednotném i množném čísle (flexivní vyhledávání), případně synonymních tvarů určitého slova (vyhledávání v tezauru).

Následující příklad hledá jakoukoli formu (footfoot, feet, a tak dále) ve sloupci Comments tabulky ProductReview v databáziAdventureWorks2025:

USE AdventureWorks2025;
GO

SELECT Comments,
       ReviewerName
FROM Production.ProductReview
WHERE CONTAINS ((Comments), 'FORMSOF(INFLECTIONAL, "foot")');
GO

Fulltextové vyhledávání používá stemmers, které umožňují hledat různé časy a konjugace slovesa, nebo jednotné i množné tvary podstatných jmen. Další informace o kmenových analyzátorech najdete v tématu Konfigurace a správa oddělovačů slov a kmenových analyzátorů.

Více informací o generačních termínech vyhledávání

inflexní tvary jsou tvary jednotného a množného čísla podstatného jména nebo různé časy a konjugace slovesa.

Například vyhledejte flexivní tvar slova drive. Pokud různé řádky v tabulce obsahují slova drive, drives, drove, driving a driven, všechna budou v sadě výsledků, protože každé z nich lze pomocí flexe vygenerovat ze slova drive.

FREETEXT a FREETEXTTABLE ve výchozím nastavení vyhledávají skloňované a časované tvary všech zadaných slov. CONTAINS a CONTAINSTABLE podporují volitelný argument INFLECTIONAL.

Hledání synonym určitého slova

tesaurus definuje uživatelsky specifikovaná synonyma pro termíny. Pro více informací o souborech tezaurů viz Konfigurovat a spravovat soubory tezaurů pro vyhledávání Full-Text.

Například pokud je do tezauru přidána položka {car, automobile, truck, van}, můžete vyhledat tezaurickou formu slova car. Všechny řádky v tabulce, které obsahují slova automobile, truck, van, nebo car se objevují ve výsledné množině, protože každé z těchto slov patří do rozšiřující množiny synonym obsahujících slovo car.

FREETEXT a FREETEXTTABLE používat tezaurus jako výchozí pravidlo. CONTAINS a CONTAINSTABLE podporují volitelný argument THESAURUS.

Hledejte slovo vedle jiného slova

Výraz blízkosti označuje slova nebo fráze, které jsou blízko sebe. Můžete také zadat maximální počet nehledaných termínů, které oddělují první a poslední hledané termíny. Kromě toho můžete hledat slova nebo fráze v libovolném pořadí nebo v pořadí, ve kterém je zadáte.

Například chcete najít řádky, ve kterých je slovo ice blízko slova hockey nebo kde je fráze ice skating blízko fráze ice hockey.

Další informace o vyhledávání podle blízkosti naleznete v tématu Vyhledání slov blízko jiného slova pomocí operátoru NEAR.

Vyhledávejte slova nebo fráze s váženými hodnotami (vážený termín)

Můžete použít k CONTAINSTABLE vyhledávání slov nebo frází a zadat váhovou hodnotu. Váha měřená jako číslo od 0,0 do 1,0 označuje důležitost každého slova a fráze v sadě slov a frází. Hmotnost 0,0 je nejnižší a hmotnost 1,0 je nejvyšší.

Následující příklad ukazuje dotaz, který vyhledává všechny zákaznické adresy pomocí vah, přičemž každý text začínající řetězcem Bay má buď Street nebo View. Výsledky dávají vyšší hodnost těm řádkům, které obsahují více zadaných slov.

USE AdventureWorks2025;
GO

SELECT AddressLine1,
       KEY_TBL.RANK
FROM Person.Address AS Address
     INNER JOIN CONTAINSTABLE (Person.Address, AddressLine1, 'ISABOUT ("Bay*",
         Street WEIGHT(0.9),
         View WEIGHT(0.1)
         ) ') AS KEY_TBL
     ON Address.AddressID = KEY_TBL.[KEY]
ORDER BY KEY_TBL.RANK DESC;
GO

Vážený termín lze použít ve spojení s libovolným jednoduchým termínem, termínem předpony, termínem generování nebo termínem blízkosti.

Více informací o vážených termínech vyhledávání

Při hledání vážených termínů vážená hodnota označuje stupeň důležitosti pro každé slovo a frázi v sadě slov a frází. Hodnota váhy 0,0 je nejnižší a hodnota váhy 1,0 je nejvyšší.

Například v dotazu, který hledá více termínů, můžete každému hledanému slovu přiřadit hodnotu váhy označující její důležitost vzhledem k jiným slovům ve hledané podmínce. Výsledky pro tento typ dotazu vrátí jako první nejrelevavantnější řádky podle relativní váhy, kterou jste přiřadili k hledaná slova. Výsledné sady obsahují dokumenty nebo řádky obsahující některý ze specifikovaných termínů (nebo obsah mezi nimi); Některé výsledky jsou však považovány za relevantnější než jiné kvůli rozdílům v vážených hodnotách spojených s různými vyhledávanými výrazy.

Vyhledávání s váženými termíny podporuje CONTAINSTABLE.

Použití operátorů AND, OR a NOT (logické operátory)

Predikát CONTAINS a funkce CONTAINSTABLE používají stejné podmínky vyhledávání. Oba podporují kombinaci několika vyhledávacích výrazů pomocí Booleovských operátorů (AND, OR, a NOT) pro provádění logických operací. Můžete například použít AND, abyste našli řádky, které obsahují jak latte , tak New York-style bagel. Můžete například použít AND NOT, abyste našli řádky, které obsahují bagel , ale neobsahují cream cheese.

Naopak FREETEXT a FREETEXTTABLE považuj Booleovské termíny za slova k vyhledávání.

Pro informace o kombinování CONTAINS s jinými predikáty, které používají logické operátory AND, OR, a , viz NOT vyhledávání.

Příklad

Následující příklad používá CONTAINS predikát k vyhledávání popisů, ve kterých ID popisu není rovno 5 a popis obsahuje jak slovo Aluminum , tak slovo spindle. Podmínka hledání používá Booleovský AND operátor. Tento příklad používá tabulku ProductDescription databáze AdventureWorks2025 .

USE AdventureWorks2025;
GO

SELECT Description
FROM Production.ProductDescription
WHERE ProductDescriptionID <> 5
      AND CONTAINS ((Description), 'aluminum AND spindle');
GO

Případ, stop slova, jazyk a tezaurus

Při psaní fulltextových dotazů můžete také zadat následující možnosti:

  • Rozlišování velkých a malých písmen. Fulltextové vyhledávací dotazy nerozlišují velká a malá písmena. V japonštině však existuje několik fonetických ortografií, ve kterých je koncept orthografické normalizace podobný případ necitlivosti (například kana = necitlivost). Tento typ ortografické normalizace není podporován.

  • Stopslova. Když definujete dotaz s plným textem, Full-Text Engine vyřadí stopwords (také nazývaná šumová slova) z vyhledávacích kritérií. Zastavovací slova jsou slova jako a, and, is, nebo the, která se často vyskytují, ale obvykle nepomáhají při hledání konkrétního textu. Stopslova jsou uvedena ve stoplistu. Každý fulltextový index je přidružený ke konkrétnímu seznamu stop, který určuje, jaká slova se v dotazu nebo indexu v době indexování vynechávají. Další informace najdete v článku Konfigurace a správa stop slov a stoplistů pro fulltextové vyhledávání.

  • Jazyk s LANGUAGE možností Na chování při dělení slov závisí mnoho termínů dotazů výrazně. Abyste zajistili, že používáte správný word breaker (a stemmer) a soubor tezauru, měli byste zadat možnost LANGUAGE. Pro více informací viz Vyberte jazyk při vytváření indexu s plným textem.

  • Tesaurus. FREETEXT a FREETEXTTABLE dotazy používají tezaurus ve výchozím nastavení. CONTAINS a CONTAINSTABLE podporují volitelný argument THESAURUS. Další informace najdete v tématu Konfigurace a správa souborů tesaurus pro Full-Text hledání.

Kontrola výsledků tokenizace

Po použití dané kombinace děliče slov, tezauru a seznamu stopslov v dotazu můžete pomocí dynamického zobrazení pro správu sys.dm_fts_parser zobrazit, jak Full-Text Search tokenizuje výsledky. Pro více informací viz sys.dm_fts_parser.