sql >> Databáze >  >> RDS >> Sqlserver

Jak používat Stopwords a Stoplist ke zlepšení SQL Server Full-Text Search (FTS)

Aktuální článek je o použití Stopwords a Stoplist. Cílem je zefektivnit fulltextové vyhledávání z hlediska úložiště a výkonu. Čtenáři tohoto článku navíc získají návod na implementaci Fulltextového vyhledávání s ignorovanými slovy a stoplistem.

Článek také zdůrazňuje důležitost ignorovaných slov a stoplistů, aby bylo fulltextové vyhledávání přesné a zabránilo se rušivým slovům.

Porozumění ignorovaným slovům a stoplistu

Nejprve si ujasněme podstatu Stopwords a Stoplist. Poté je použijeme ke zlepšení Fulltextového vyhledávání.

Stoplist

Stoplist, jak název napovídá, je seznam stopwords. Když je stoplist spojen s fulltextovým vyhledáváním, může odfiltrovat nesmyslná slova nebo výrazy a zlepšit tak výsledky vyhledávání.

Nedostupné slovo

Stopword je slovo, které má ve fulltextovém vyhledávání vedlejší roli, přestože je gramaticky důležité. Proto není ignorované slovo z pohledu fulltextového vyhledávání nezbytné.

Podle dokumentace společnosti Microsoft může být ignorovaným slovem slovo s určitým významem v určitém jazyce nebo to může být nějaký symbol bez jazykové hodnoty. V obou případech je pro Fulltextové vyhledávání k ničemu.

Příklady ignorovaných slov

Následující ignorovaná slova jsou v (britské/americké) angličtině:

  • jako
  • v
  • být
  • protože
  • on
  • udělal

Vzhledem k tomu, že výše uvedená slova nepřispívají k fulltextovému vyhledávání, jedná se o ignorovaná slova, přestože mají význam pro porozumění celé větě.

Systémové stoplisty

Každý podporovaný jazyk, včetně britské angličtiny, má výchozí nebo systémový stoplist, který lze upravit podle konkrétních požadavků.

Vlastní stoplisty

Uživatelé si mohou vytvořit vlastní/vlastní stoplist pomocí systémového stoplistu nebo od začátku. Je užitečné zabránit tomu, aby se šumová slova stala součástí výsledků fulltextového vyhledávání.

Jazyky a stoplisty

Fulltextové vyhledávání podporuje mnoho různých jazyků. Každý z podporovaných jazyků má ve výchozím nastavení alespoň jeden stoplist systému. Může však existovat více stoplistů pro jakýkoli jazyk, včetně systémových i vlastních stoplistů.

Seznam podporovaných jazyků

Můžeme rychle zkontrolovat seznam všech podporovaných jazyků používaných s fulltextovým vyhledáváním. Za tímto účelem spusťte následující skript T-SQL:

-- List of Full-Text Search supported languages
SELECT ftl.lcid,ftl.name FROM sys.fulltext_languages ftl

Výsledky jsou následující:

Dotaz na instanci SQL Server 2016 vrátí celkem 53 jazyků.

Použití ignorovaných slov a stoplistu s fulltextovým vyhledáváním

Nyní získáme praktické zkušenosti s vytvářením stoplistu ignorovaných slov definovaných uživatelem. Poté jej použijeme pro fulltextové vyhledávání jako návod. Bude to jako scénář v reálném čase.

Předpoklady

Pro správnou implementaci návodu musíte nejprve zajistit následující požadavky:

  • Základní znalost fulltextového vyhledávání
  • Možnost implementovat fulltextové vyhledávání na SQL Server
  • Přítomnost aktivované/instalované možnosti Full-Text Search v instanci SQL, kterou plánujete používat

Abyste zajistili tyto předpoklady, projděte si níže uvedené články, pokud jste již obeznámeni se skriptováním T-SQL:

  • Implementace fulltextového vyhledávání v SQL Server 2016 pro začátečníky
  • Implementace fulltextového vyhledávání v SQL Server 2016 pro pokročilé uživatele

Zkontrolujte stav fulltextového vyhledávání

Spuštěním následujícího dotazu zkontrolujte, zda máte ve své instanci SQL nainstalované fulltextové vyhledávání:

-- Is Full-Text Search installed then 1 or 0
SELECT fulltextserviceproperty('IsFulltextInstalled') as [Full-Text Search]

Výsledek výše uvedeného skriptu by měl vrátit 1 takto:

Pokud dostáváte jiné číslo než 1, podívejte se znovu na výše uvedené články.

Nastavení ukázkové databáze (WatchReviewsStoplist)

Nejprve musíte nastavit vzorovou databázi s názvem WatchReviewsStoplist . Použijte níže uvedený skript:

-- Create WatchReviewsStoplist database
CREATE DATABASE WatchReviewsStoplist;
GO

-- Connect to the sample database
USE WatchReviewsStoplist

-- (2) Create WatchReview table
CREATE TABLE [dbo].[WatchReview]
(
	[ReviewId] INT NOT NULL IDENTITY , 
    [Date] DATETIME2 NULL, 
    [Person] VARCHAR(50) NULL, 
    [Details] VARCHAR(1000) NULL, 
    CONSTRAINT [PK_WatchReview] PRIMARY KEY (ReviewId)
)

-- (3) Populate WatchReview table
SET IDENTITY_INSERT [dbo].[WatchReview] ON
INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (1, N'2020-01-01 00:00:00', N'Atif', N'Hi, I have just bought this Casio black digital watch which is excellent and has date, alarm, stopwatch and timer as well.')
INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (2, N'2020-01-02 00:00:00', N'Qasim', N'Hi, I have just bought this Casio black analog watch which is average and slightly discomforting and just got date and time.')
INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (3, N'2020-01-03 00:00:00', N'Martin', N'Hi, I have just purchased this Casio black digital watch which is excellent and has features like alarm, stopwatch, date and timer. ')
INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (4, N'2020-01-10 00:00:00', N'Brian ', N'Hi, I have just ordered this Seiko black digital watch which is excellent and has date, alarm and timer.')
INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (5, N'2020-01-11 00:00:00', N'Sarah', N'Hi, I have just ordered this Seiko white analog watch which is average and has alarm, date and timer.')
SET IDENTITY_INSERT [dbo].[WatchReview] OFF

Zkontrolujte ukázkovou databázi

Chcete-li zobrazit obsah tabulky v ukázkové databázi, spusťte následující skript T-SQL:

-- Check sample database
SELECT wr.ReviewId,wr.Person,wr.Details FROM dbo.WatchReview wr

Výstup je následující:

Scénář stoplist

Předpokládejme, že jsme požádali vývojový tým o vylepšení fulltextového vyhledávání pro recenze zákazníků. Měli by to udělat tak, že vyloučí šumová slova. Tímto způsobem zůstává fulltextové vyhledávání efektivní a také zaměřené.

Abychom splnili tyto požadavky, musíme nejprve nastavit Full-Text Search. Znamená to provést následující akce:

  • Vytvořte fulltextový katalog
  • Vytvořte prázdný vlastní nebo uživatelem definovaný seznam stop
  • Vytvořte fulltextový index

Vytvořit fulltextový katalog

Vytvořte fulltextový katalog pomocí následujícího skriptu:

-- Create Full-Text catalog
CREATE FULLTEXT CATALOG [WatchReviewCatalog] AS DEFAULT;
GO

Vytvořte prázdný vlastní stoplist

Vytvořte prázdný vlastní seznam stop pomocí následujícího skriptu:

-- Create empty custom stoplist
CREATE FULLTEXT STOPLIST [WatchReviewStoplist];
GO  

Nyní je vytvořena vlastní stoplist.

Vytvořit fulltextový index

Nakonec vytvořte fulltextový rejstřík ve sloupci Podrobnosti pro britskou angličtinu. Bude ukazovat na vlastní stoplist vytvořený dříve. Pro tuto akci použijte následující skript T-SQL:

-- Create Full-Text index pointing to the previously created Stoplist
CREATE FULLTEXT INDEX ON dbo.WatchReview(Details LANGUAGE [British English]) 
   KEY INDEX PK_WatchReview  
   WITH STOPLIST = WatchReviewStoplist;  
GO  

Úplný textový dotaz pro získání skvělých hodinek hodnocených zákazníkem

Spusťte následující fulltextový dotaz a zjistěte, který produkt (hodinky) získaly od zákazníků vynikající známky:

--Search customer reviews where the product was rated excellent
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'excellent') 

Výsledky jsou níže:

Vidíme, že zákazníci dali černým digitálním hodinkám vynikající hodnocení. Na základě recenzí proto známe nejlepší produkt a chápeme, že fulltextové vyhledávání funguje dobře.

Přesto existuje několik obav, které byste mohli ignorovat u tabulky o pěti řádcích, ale pokud se rychle vyřeší, může nám přinést výhody výkonu a úložiště v relativně velké sadě výsledků.

Vyhledejte šumové slovo „Ahoj“ pomocí fulltextového dotazu

K fulltextovému indexu je připojeno mnoho šumových slov. Brzy se mohou stát zátěží. Navíc nejsou k vyhledávání k ničemu.

Zkontrolujeme, zda je šumové slovo Ahoj je přítomen ve výsledcích fulltextového vyhledávání, protože je lepší jej vyloučit.

Spusťte fulltextový dotaz takto:

--Run Full-Text query to Search for Noise word 'Hi'
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'Hi')

Výsledky jsou níže:

Vrácené výsledky ukazují, že slovo „Ahoj“ je součástí výsledků fulltextového vyhledávání. Musíme ji tedy vyloučit – pro vyhledávání to nemá smysl a nepomůže žádné analýze.

Změňte stoplist a přidejte stopword Ahoj

Přidáme stopword Ahoj úpravou našeho vlastního stoplistu tak, aby nemohl být indexován fulltextovým vyhledáváním a neměl by být vracen fulltextovými dotazy, abychom ušetřili místo a zlepšili vyhledávání:

--Alter customer stoplist to add Hi noise word
ALTER FULLTEXT STOPLIST WatchReviewStoplist
ADD 'Hi' LANGUAGE 'British English';  

Po přidání jako Stopword znovu vyhledejte šumové slovo „Ahoj“

Po přidání do Stoplistu vyhledejte šumové slovo Ahoj:

--Search Noise word 'Hi' after it has been added as a stopword
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'Hi')

Výstup je následující:

Zkontrolujte přidaná ignorovaná slova

Kdykoli můžete zkontrolovat ignorovaná slova přidaná do Stoplistu. Spusťte k tomu následující skript:

-- Check added stopwords 
SELECT * FROM sys.fulltext_stopwords

Výsledky jsou níže:

Gratulujeme! Úspěšně jste vytvořili stoplist a přidali do něj stopword. Tímto způsobem zefektivníte fulltextové vyhledávání z hlediska výkonu i úložiště.

Co dělat

Nyní, když můžete vytvářet stoplisty a přidávat do nich stopová slova, vyzkoušejte následující, abyste své dovednosti dále zlepšili:

  • Přidejte slova „já“, „toto“, „jen“, „jako šumová slova do svého vlastního seznamu stop vytvořeného v tomto návodu.
  • Zkontrolujte přidaná ignorovaná slova spuštěním skriptu, který jsme zadali na konci návodu.

  1. SQL DELETE s JOIN další tabulkou pro podmínku WHERE

  2. Jak přejmenovat název sloupce v SQL?

  3. Jak zkontrolovat chybějící číslo z řady čísel?

  4. Úvod do správy MaxScale Použití maxctrl pro MariaDB Cluster