Dotaz s využitím vyhledávání Full-Text
platí pro:SQL Server
Azure SQL Database
azure SQL Managed Instance
Psát fulltextové dotazy pomocí predikátů CONTAINS a FREETEXT a funkcí hodnot řádků CONTAINSTABLE a FREETEXTTABLE pomocí 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.
- Chcete-li porovnat slova a fráze, použijte CONTAINS a CONTAINSTABLE.
- Aby odpovídal významu, ale ne přesnému vyjádření, použijte FREETEXT a FREETEXTTABLE.
Příklady jednotlivých predikátů a funkcí
Následující příklady používají ukázkovou databázi AdventureWorks. Poslední vydání AdventureWorks najdete v části Databáze a skripty AdventureWorks pro SQL Server 2016 CTP3. Abyste mohli spouštět ukázkové dotazy, musíte také nastavit Full-Text Vyhledávání. Další informace najdete v části Začínáme s Full-Text Vyhledávání.
Příklad – CONTAINS
Následující příklad najde všechny produkty s cenou $80.99
, které obsahují slovo "Mountain"
:
USE AdventureWorks2022
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 AdventureWorks2022
GO
SELECT Title
FROM Production.Document
WHERE FREETEXT (Document, 'vital safety components')
GO
Příklad – CONTAINSTABLE
Následující příklad vrátí ID a popis všech produktů, pro které sloupec Popis obsahuje slovo "hliník" v blízkosti slova "lehký" nebo "nízká hmotnost". Vrátí se pouze řádky s pořadím 2 nebo vyšším.
USE AdventureWorks2022
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 dotaz FREETEXTTABLE tak, aby vrátil první seřazené řádky a přidal pořadí každého řádku do seznamu select. Pokud chcete napsat podobný dotaz, musíte vědět, že ProductDescriptionID je jedinečným klíčovým sloupcem tabulky ProductDescription.
USE AdventureWorks2022
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 AdventureWorks2022
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
/
CONTAINSTABLE
a FREETEXT
/FREETEXTTABLE
jsou užitečné pro různé druhy porovnávání. Následující informace vám pomůžou zvolit nejlepší predikát nebo funkci dotazu:
CONTAINS/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. Další informace najdete v tématu Použití logických operátorů (AND, OR a NOT) dále v tomto článku.
FREETEXT/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
/FREETEXT
a funkce hodnot sady řádků CONTAINSTABLE
/FREETEXTTABLE
mají různé syntaxe a možnosti. Následující informace vám pomůžou zvolit nejlepší predikát nebo funkci dotazu:
Predikáty CONTAINS a FREETEXT
využití . Použijte fulltextové predikáty CONTAINS a FREETEXT v příkazu SELECT v klauzuli WHERE nebo HAVING.
výsledky. Predikáty CONTAINS a FREETEXT vrátí hodnotu PRAVDA nebo NEPRAVDA, která označuje, zda daný řádek odpovídá fulltextovém dotazu. V sadě výsledků se vrátí odpovídající řádky.
Další možnosti. Predikáty můžete kombinovat s libovolnými dalšími Transact-SQL predikáty, jako je 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.
V predikátu CONTAINS nebo FREETEXT můžete použít čtyřdílný název k dotazování fulltextových indexovaných sloupců 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.
Další informace. Další informace o syntaxi a argumentech těchto predikátů naleznete v tématu CONTAINS a FREETEXT.
Funkce hodnot sady řádků CONTAINSTABLE a FREETEXTTABLE
Využití. Použijte fulltextové funkce CONTAINSTABLE a FREETEXTTABLE, jako je 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 je nutné 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 povoleným fulltextovým režimem, slouží k vynucení jedinečných řádků pro tabulku (jedinečný**klíčový sloupec). Další informace o klíčovém sloupci najdete v tématu Vytvoření a správa indexů Full-Text.
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í, vrátí také hodnotu řazení podle relevance (RANK) a fulltextový klíč (KEY) pro každý vrácený řádek následujícím způsobem:
- sloupec KEY. Sloupec KEY vrátí jedinečné hodnoty vrácených řádků. Sloupec KEY lze použít k zadání kritérií výběru.
- Sloupec pořadí. Sloupec RANK vrátí hodnotu pořadí pro každý řádek, který určuje, 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. Další informace naleznete v tématu Omezení výsledků hledání pomocí RANK.
Další informace. Další informace o syntaxi a argumentech těchto funkcí naleznete v tématu CONTAINSTABLE a FREETEXTTABLE.
Konkrétní typy hledání
Vyhledání konkrétního slova nebo fráze (jednoduchý termín)
Můžete použít CONTAINS, CONTAINSTABLE, FREETEXTnebo FREETEXTTABLE pro vyhledání konkrétního slova nebo fráze. Pokud například chcete prohledat tabulku ProductReview v databázi AdventureWorks2022
a najít všechny komentáře k produktu s frází "křivka učení", můžete použít predikát CONTAINS následujícím způsobem:
USE AdventureWorks2022
GO
SELECT Comments
FROM Production.ProductReview
WHERE CONTAINS(Comments, '"learning curve"')
GO
Podmínka hledání, v tomto případě "křivka učení", může být složitá a může se skládat z jednoho nebo více termínů.
Další informace o jednoduchých vyhledávání 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 "croissant" je slovo a "café au lait" je fráze. Slova a fráze, jako jsou tyto, se nazývají jednoduché termíny.
OBSAHUJE a OBSAHUJE TABULKU, aby se vyhledala přesná shoda fráze. FREETEXT a FREETEXTTABLE rozdělují frázi na samostatná slova.
Vyhledání slova s předponou (termín s předponou)
Pomocí CONTAINS nebo CONTAINSTABLE můžete hledat slova nebo fráze se zadanou předponou. Vrátí se všechny položky ve sloupci, které obsahují text začínající zadanou předponou. Chcete-li například vyhledat všechny řádky, které obsahují předponu top
-, například v top``ple
, top``ping
a top
. Dotaz vypadá jako v následujícím příkladu:
USE AdventureWorks2022
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 odděleny dvojitými uvozovkami, jako v CONTAINS (DESCRIPTION, 'top*')
, fulltextové vyhledávání nepovažuje hvězdičku za zástupný znak..
Pokud je termín předpony frází, každý token, který tvoří frázi, se považuje za samostatný termín předpony. Vrátí se všechny řádky, které mají slova začínající na předpony. Například termín s předponou "světlý chléb*" najde řádky s textem "obalovaný světlý chléb", "lehce obalovaný chléb" nebo "světlý chléb", ale nevrátí "lehce opečený chléb".
Další informace o vyhledávání předpon
Předpona označuje řetězec, který je umístěn před slovem, aby vytvořil odvozeninu nebo tvar skloňování.
U jednoho termínu předpony bude každé slovo začínající zadaným termínem součástí sady výsledků. Například výraz "auto*" odpovídá slovům jako "automatický", "automobil" a podobně.
Pro frázi se každé slovo v rámci fráze považuje za předponu termínu. Například termín "auto tran*" odpovídá "automatické převodovce" a "automobilovému transduceru", ale neodpovídá "automatické motorové převodovce".
Prefixové vyhledávání je podporováno pomocí CONTAINS a CONTAINSTABLE.
Hledání mluvnických tvarů konkrétního slova (Generační termín)
Můžete použít CONTAINS, CONTAINSTABLE, FREETEXTnebo FREETEXTTABLE k vyhledání všech různých časů a konjugací slovesa, jednotných i množných tvarů podstatných jmen (inflexní vyhledávání) nebo pro vyhledávání synonym určitého slova (vyhledávání pomocí tezauru).
Následující příklad vyhledá libovolnou formu slova „noha“ („noha“, „nohy“ atd.) ve sloupci Comments
tabulky ProductReview
v databázi AdventureWorks
.
USE AdventureWorks2022
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. Pro více informací o stemmerech se podívejte na Konfiguraci a správu dělení slov a stemmerů pro vyhledávání.
Více informací o vyhledávání generovaných termí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 skloňovaný tvar slova "řídit". Pokud různé řádky v tabulce obsahují slova "řídit", "řídí", "řídil", "řízení" a "řízený", všechny by byly ve výsledné sadě, protože každý z těchto tvarů může být skloňován ze slova "řídit".
FREETEXT a FREETEXTTABLE ve výchozím nastavení hledají inflexní termíny 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. Další informace o souborech tezaurus najdete v tématu Konfigurace a správa souborů tezaurus pro Full-Text vyhledávání.
Pokud je například položka {auto, automobil, nákladní auto, dodávka} přidána do tezauru, můžete vyhledat tezaurus ve formě slova "car". Všechny dotazované řádky v tabulce, které obsahují slova "automobil", "nákladní auto", "dodávka" nebo "car", se zobrazí v sadě výsledků, protože každé z těchto slov patří do rozšiřující sady synonym obsahující slovo "car".
FREETEXT a FREETEXTTABLE používají tezaurus ve výchozím nastavení.
CONTAINS a CONTAINSTABLE podporují volitelný argument THESAURUS
.
Hledání slova blízko 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 "led" blízko slova "hokej" nebo ve kterém je fráze "ledové bruslení" blízko fráze "ledový hokej".
Další informace o hledání na základě blízkosti naleznete v tématu Hledání slov blízko jiného slova s NEAR.
Hledání slov nebo frází pomocí vážených hodnot (vážený termín)
Pomocí CONTAINSTABLE můžete hledat slova nebo fráze a zadat hodnotu váhy. 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ý hledá všechny adresy zákazníků s použitím vah, ve kterém je jakýkoli text začínající řetězcem "Bay" a má buď "Street" nebo "View". Výsledky poskytují vyšší pořadí těm řádkům, které obsahují více z udaných slov.
USE AdventureWorks2022
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.
Další informace o vyhledávání vážených termí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. Sady výsledků obsahují dokumenty nebo řádky obsahující některé ze zadaných termínů (nebo obsah mezi nimi); Některé výsledky se však budou považovat za relevantnější než jiné, protože variace vážených hodnot spojených s různými hledané termíny.
Vážené vyhledávání termínů podporuje CONTAINSTABLE.
Použití operátorů AND, OR a NOT (logické operátory)
Predikát CONTAINS a funkce CONTAINSTABLE používají stejné podmínky hledání. Obě podporují kombinování několika hledaných termínů pomocí logických operátorů – AND, OR a NOT – k provádění logických operací. Pomocí funkce AND můžete například najít řádky, které obsahují "latte" i "New York-style bagel". Funkci AND NOT můžete použít například k vyhledání řádků, které obsahují "bagel", ale neobsahují "smetanový sýr".
Naproti tomu FREETEXT a FREETEXTTABLE považují logické operátory za slova, která mají být prohledána.
Informace o kombinování funkce CONTAINS s jinými predikáty, které používají logické operátory AND, OR a NOT, naleznete v podmínce hledání (Transact-SQL).
Příklad
Následující příklad používá predikát CONTAINS k vyhledání popisů, ve kterých se ID popisu nerovná 5, a popis obsahuje slovo "Hliník" i slovo "špindler". Podmínka hledání používá logický operátor AND. V tomto příkladu se používá tabulka ProductDescription z databáze AdventureWorks2022
.
USE AdventureWorks2022
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 orthografické normalizace není podporován.
Stopslova. Při definování fulltextového dotazu modul Full-Text zahodí z kritérií hledání stopwords (označované také jako šumová slova). Stopwords jsou slova, jako je "a", "and", "is", nebo "the", která mohou nastat často, 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 tématu Konfigurace a správa stopslov a seznamů stopslov pro Full-Text vyhledávání.
jazyk, s možností JAZYK. Na chování při dělení slov závisí mnoho termínů dotazů výrazně. Pokud chcete zajistit, že používáte správný oddělovač slov (a zmenšovač tvarů) a soubor tezaurus, doporučujeme zadat volbu LANGUAGE. Další informace najdete v tématu Volba jazyka při vytváření Full-Text indexu.
Tesaurus. Dotazy FREETEXT a FREETEXTTABLE ve výchozím nastavení používají tesaurus. CONTAINS a CONTAINSTABLE podporují volitelný argument THESAURUS. Další informace najdete v tématu Konfigurace a správa souborů tezaurus pro vyhledávání Full-Text.
Kontrola výsledků tokenizace
Po použití daného nástroje pro dělení slov, tesauru a kombinace stoplist v dotazu můžete zjistit, jak Full-Text Hledání tokenizuje výsledky pomocí sys.dm_fts_parser zobrazení dynamické správy. Další informace naleznete v tématu sys.dm_fts_parser (Transact-SQL).
Viz také
OBSAHUJE (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
FREETEXT (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
Vytvoření Full-Text Vyhledávacích dotazů (Visual Database Tools)
Zlepšit výkon dotazů Full-Text