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.