Att skapa och hantera stopplistor fungerar som en av huvudkomponenterna som är ansvariga för att förbättra prestanda för fulltextsökning tillsammans med att minska storleken på indexet. Den här artikeln syftar till att hjälpa dig att bemästra jobbet på djupet och implementera flera strategier för att skapa stopplistor på enkla men intressanta exempel.
Vi kommer också att belysa vikten av olika metoder för att generera stopplistor och förtydliga hur man väljer den mest lämpliga metoden.
Varför bemästra stopplistor
När vi talar om att använda stopplistor när det gäller fulltextsökning, är den första frågan varför vi lär oss så mycket om dessa stopplistor. Svaret ligger i både de uppenbara och dolda fördelarna med att använda stopplistor med fulltextsökning. Det finns också långsiktiga vinster de kan ge när de väl implementerats.
Vikten av stopplistor
En stopplista är en språkspecifik komponent i fulltextsökning som innehåller användardefinierade eller systemtillhandahållna stoppord. Den måste utesluta sådana ord från att bli en del av fulltextsökning.
En fulltextsökningsdesign utan en stopplista är inte den optimala användningen av språkspecifika komponenter som borde förbättra effektiviteten och svarstiden för fulltextsökning.
Förutsättningar
- Du kan skriva och köra T-SQL-skript.
- Fulltextsökning måste installeras i din SQL Server-instans.
- Du är bekant med grundläggande fulltextsökningskoncept och implementering.
- Du har grundläggande kunskaper om stoppord och stopplista.
Om du saknar information för att säkerställa ovanstående krav, se nedanstående artiklar:
- Implementering av fulltextsökning i SQL Server 2016 för nybörjare
- Implementering av fulltextsökning i SQL Server 2016 för avancerade användare
- Hur man använder stoppord och stopplista för att förbättra SQL Server Full-Text Search (FTS)
Flera strategier för att skapa stopplistor
Det finns många olika metoder eller strategier, men vissa av dem är mycket bättre än andra. Alla databasutvecklare med färdigheter i implementering av Full-Text Search bör känna till alla metoder för att välja den bästa vid behov.
Det mest effektiva sättet att förstå dessa olika strategier är att tillämpa dem mot en exempeldatabas.
Konfigurera exempeldatabas
Det första steget är att ställa in databasen för att köra fulltextfrågor. Skapa en exempeldatabas som heter WatchReviewsMasterStoplist :
-- Create WatchReviewsMasterStoplist database
CREATE DATABASE WatchReviewsMasterStoplist;
GO
-- Connect to the sample database
USE WatchReviewsMasterStoplist
-- (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-06-01 00:00:00', N'Asif', 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-07-02 00:00:00', N'Asim', 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-08-03 00:00:00', N'Martin', N'Hi, I have just purchased this Casio black digital watch which is excellent and has features like an alarm, stopwatch, date, and timer. ')
INSERT INTO [dbo].[WatchReview] ([ReviewId], [Date], [Person], [Details]) VALUES (4, N'2020-09-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-10-11 00:00:00', N'Peter', 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
Översikt över strategier för flera stopplistor
Du kan använda följande tre sätt/strategier för att skapa en stopplista och förhindra brusord från att bli en del av dina fulltextsökningar:
- Skapa en anpassad stopplista
- Skapa en systemstopplista
- Skapa en stopplista från en anpassad (eller system) stopplista
Förutsättningar för stopplista
Kom ihåg att innan du skapar en stopplista måste du göra följande:
- Skapa ett unikt index på en av tabellkolumnerna om det inte finns någon nyckelkolumn tillgänglig (Primärnyckel).
- Skapa en fulltextkatalog.
- Skapa ett fulltextindex.
Skapa en anpassad stopplista
Antag att ett unikt index eller primärnyckelkolumn är tillgänglig (som i vår exempeldatabas). Vi skapar en anpassad stopplista enligt följande:
- Skapa en fulltextkatalog.
- Skapa en tom anpassad stopplista.
- Skapa ett fulltextindex med den anpassade stopplistan som skapades i steg 2.
För detaljerad information, se artikeln Hur man använder stoppord och stopplista för att förbättra SQL Server Full-Text Search (FTS)
För- och nackdelar med anpassade stopplistor
Den största fördelen med att skapa en anpassad stopplista är att du kan ha full kontroll över den och hålla reda på den genom att lägga till och ta bort ord som du tror är brusord.
Det finns dock en nackdel med att använda detta tillvägagångssätt. Stoplistan är mycket begränsad och den kommer inte att inkludera de systemrekommenderade stopporden för att förbättra prestanda för fulltextfrågor ytterligare.
Skapa en systemstopplista
Skapa en systemstopplista (om primärnyckelkolumnen eller unika index finns) enligt följande:
- Skapa en fulltextkatalog.
- Skapa ett fulltextindex med systemets stopplista.
Vi förbereder oss för att använda systemets stopplista genom att först skapa en fulltextkatalog:
-- Create Full-Text catalog
CREATE FULLTEXT CATALOG [WatchReviewCatalog] AS DEFAULT;
GO
Skapa ett fulltextindex i recensionerkolumnen (Detaljer) i tabellen WatchReview med systemets stopplista. Använd följande T-SQL-skript:
-- Create Full-Text index with System Stoplist
CREATE FULLTEXT INDEX ON dbo.WatchReview(Details LANGUAGE [British English])
KEY INDEX PK_WatchReview
WITH STOPLIST = System;
GO
Visa stopplistan för det engelska språksystemet
Du kan se listan över stoppord som ingår i systemstopplistan för brittisk engelska. Kör följande SQL-fråga:
-- View system stoplist of English language
SELECT name,stopword FROM sys.fulltext_system_stopwords sw
INNER JOIN sys.fulltext_languages fl
on sw.language_id=fl.lcid
where name='British English'
Utgången är som följer:
Visa de tre senaste recensionerna
Kör en snabb kontroll mot den nyskapade exempeldatabasen. Gör det genom att få de tre senaste klockrecensioner från WatchReview tabell:
-- Top 3 most recent watch reviews
SELECT TOP 3 wr.Person,FORMAT(wr.Date,'dd-MMM-yyyy') as ReviewDate,wr.Details FROM dbo.WatchReview wr
ORDER BY wr.Date DESC
Utgången är som följer:
Kontrollera stoppord genom att köra fulltextfrågor
Vi kan köra fulltextfrågor mot den nominerade tabellen. Bli inte förvånad om många brusord (ingår i systemstopplistan för att förbättra prestandan) inte dyker upp i fulltextfrågorna. Det betyder att vår systemstopplista gör sitt jobb korrekt.
Som vi kan se är ordet 'detta' finns bland de 3 bästa recensionerna. Det är dock ett brusord som i sig känns igen av systemets stopplista.
Låt oss kontrollera om en fulltextsökning returnerar brusordet 'detta' ingår i systemets stopplista:
--Run Full-Text query to Search for Noise word 'this'
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'this')
Resultatuppsättningen är nedan:
Nu kan vi köra fulltextfrågan för att söka efter ordet 'är' vilket är ett annat brusord:
--Run Full-Text query to Search for Noise word 'is'
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'is')
Frågeutgången är nedan:
Vi kan se att ordet "är" har också framgångsrikt förhindrats från att bli en del av fulltextfrågeresultatet genom att spara värdefulla resurser.
Fulltextfråga för att söka efter ordet "Hej"
Vi kör en fulltextfråga för att söka efter ordet 'Hej.' Det är inte en del av systemets stopplista. Därför måste frågan returnera den.
--Search Noise word 'Hi'
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'Hi')
Utgången är som följer:
Vi har alla poster som innehåller ordet 'Hej.' Vi vill dock utesluta det, eftersom det är ett bullerord. Om vi använder fulltextsökning i vår textanalys kan detta ord distrahera oss från målet.
Detta leder oss till den tredje metoden:skapa en stopplista från en anpassad eller systemstopplista.
Skapa en anpassad stopplista från systemstopplistan
Skapa en anpassad stopplista som heter WatchMasterStoplist från systemets stopplista med följande T-SQL-skript:
--Creating a custom stoplist WatchMasterStoplist from system stoplist
CREATE FULLTEXT STOPLIST [WatchMasterStoplist] FROM SYSTEM STOPLIST;
GO
Associera en ny anpassad stopplista med fulltextindex
Associera den nyskapade anpassade stopplistan med Full-Text-indexet enligt följande:
USE [WatchReviewsMasterStoplist]
GO
-- Associating new custom stoplist with Full-Text index
ALTER FULLTEXT INDEX ON [dbo].[WatchReview] SET STOPLIST = [WatchMasterStoplist]
Kontrollera den anpassade stopplistan genom att söka efter ordet "detta"
Du kan snabbt kontrollera om din anpassade stopplista innehåller alla brusord från systemets stopplista. Kör samma kod som vi använde tidigare för att söka efter ordet 'detta.'
--Run Full-Text query to Search for Noise word 'this'
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'this')
Denna utdata måste vara tom.
Lägga till ett nytt brusord "Hej" till den anpassade stopplistan
Vi måste lägga till brusordet 'Hej' till den nyskapade anpassade stopplistan. Kör följande skript:
--Alter customer stoplist to add Hi noise word
ALTER FULLTEXT STOPLIST WatchMasterStoplist
ADD 'Hi' LANGUAGE 'British English';
Resultatuppsättningen är nedan:
Den sista kontrollen
Nu kommer vi att köra den sista Full-Text-frågekontrollen för vissa brusord – vi jämför den med den ursprungliga resultatuppsättningen som innehåller dessa brusord.
Till exempel, om vi fokuserar på den fjärde recensionen (ordnad efter ReviewId ), som innehåller några brusord, och sedan jämför resultaten med fulltextfrågeresultaten, bör vi inte se några brusord.
Kör följande skript för att utföra den sista kontrollen mot exempeldatabasen:
USE WatchReviewsMasterStoplist
-- View the record which contains fourth review
SELECT ReviewId
,[Date]
,Person
,Details
FROM dbo.WatchReview
where ReviewId=4
--Run Full-Text query to Search for Noise words in the fourth review
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'"Hi" OR "this" OR "I" OR "is" OR "and"')
and ReviewId=4
Utgången är som följer:
Fulltextfråga för att söka efter recensioner av digitala klockor
Nu kan vi köra våra fulltextsökfrågor med stopplistan på plats. Följande T-SQL-skript kommer att informera oss om recensioner av digitala klockor (exempel):
USE WatchReviewsMasterStoplist
--Run Full-Text query to Search for digital watch reviews sample
SELECT * FROM dbo.WatchReview WHERE CONTAINS(Details,'digital')
Resultaten är nedan:
Grattis! Vi har framgångsrikt implementerat alla tre metoderna för att skapa och associera stopplistor. Vi undersökte också att lägga till nya ord till stopplistor och kontrollera prestandan.
Ändå rekommenderar jag starkt den tredje metoden. Skapa en anpassad stopplista från en systemstopplista och lägg sedan till brusord för att förbättra din fulltextsökning.
Saker att göra
Nu när du är väl medveten om tre metoder för att skapa stopplistor kan du göra några övningar för att förbättra dina färdigheter i textanalys, som följande:
- Lägg till en anpassad stopplista från systemets stopplista mot exempeldatabasen, som i den här artikeln.
- Skapa en anpassad stopplista från systemets stopplista mot exempeldatabasen, som i den här artikeln.
- Kör en T-SQL-fråga för att se de tillagda stopporden efter att ha blivit bekant med den här artikeln.