sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man använder stoppord och stopplista för att förbättra SQL Server Full-Text Search (FTS)

Den aktuella artikeln handlar om användning av stoppord och stopplistor. Syftet är att göra Full-Text Search mer effektivt vad gäller lagring och prestanda. Dessutom kommer läsarna av den här artikeln att få en genomgång av hur man implementerar fulltextsökning med stoppord och stopplista.

Artikeln belyser också vikten av stoppord och stopplistor för att hålla fulltextsökningen exakt och undvika störande ord.

Förstå stoppord och stopplista

Låt oss först klargöra essensen av stoppord och stopplista. Sedan fortsätter vi att använda dem för att förbättra fulltextsökning.

En stopplista

En stopplista är, som namnet antyder, en lista med stoppord. När stopplistan är kopplad till fulltextsökning kan stopplistan filtrera bort meningslösa ord eller termer och på så sätt förbättra sökresultaten.

Ett stoppord

Ett stoppord är ett ord som har en mindre roll i fulltextsökning, trots att det är grammatiskt viktigt. Därför är ett stoppord inte nödvändigt ur fulltextsökningsperspektivet.

Enligt Microsofts dokumentation kan ett stoppord vara ett ord med en viss betydelse på ett specifikt språk, eller så kan det vara någon token utan språkligt värde. I båda fallen är det värdelöst för fulltextsökning.

Exempel på stoppord

Följande är stoppord på det (brittiska/amerikanska) engelska språket:

  • som
  • vid
  • vara
  • för
  • han
  • gjorde

Eftersom orden ovan inte bidrar till fulltextsökning är de stoppord, trots deras betydelse för att förstå en hel mening.

Systemstopplistor

Varje språk som stöds, inklusive brittisk engelska, har en standard- eller systemstopplista som kan ändras enligt särskilda krav.

Anpassade stopplistor

Användare kan skapa sin egen/anpassade stopplista, med hjälp av systemets stopplista, eller från grunden. Det är till hjälp att förhindra brusord från att bli en del av fulltextsökningsresultaten.

Språk och stopplistor

Fulltextsökning stöder många olika språk. Vart och ett av de språk som stöds har som standard minst en systemstopplista. Det kan dock finnas flera stopplistor för alla språk, inklusive både system och anpassade stopplistor.

Lista över språk som stöds

Vi kan snabbt kontrollera listan över alla språk som stöds som används med fulltextsökning. För detta, kör följande T-SQL-skript:

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

Resultaten är följande:

Frågan på SQL Server 2016-instansen returnerar totalt 53 språk.

Använda stoppord och stopplista med fulltextsökning

Nu ska vi få lite praktisk erfarenhet av att skapa en stopplista med stoppord som definierats av användaren. Sedan kommer vi att använda den för fulltextsökningen som en genomgång. Det blir precis som ett realtidsscenario.

Förutsättningar

Först och främst måste du säkerställa följande krav för att implementera genomgången korrekt:

  • Ha en grundläggande förståelse för fulltextsökning
  • Möjligheten att implementera fulltextsökning i SQL Server
  • Närvaron av fulltextsökningsalternativet aktiverat/installerat på SQL-instansen du planerar att använda

För att säkerställa dessa förutsättningar, gå igenom artiklarna nedan om du redan är bekant med T-SQL-skript:

  • 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

Kontrollera status för fulltextsökning

Kör följande fråga för att kontrollera om du har Full-Text Search installerad i din SQL-instans:

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

Resultatet av ovanstående skript bör returnera 1 enligt följande:

Om du får något annat nummer än 1, se artiklarna som nämns ovan igen.

Konfigurera exempeldatabas (WatchReviewsStoplist)

Först måste du skapa en exempeldatabas med namnet WatchReviewsStoplist . Använd skriptet nedan:

-- 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

Kontrollera exempeldatabas

Kör följande T-SQL-skript för att se tabellinnehållet i exempeldatabasen:

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

Utgången är som följer:

Stopplistscenario

Anta att vi har bett utvecklingsteamet att förbättra fulltextsökningen för kundernas recensioner. De borde göra det genom att utesluta brusord. På så sätt förblir fulltextsökningen effektiv och även fokuserad.

För att uppfylla dessa krav måste vi först ställa in fulltextsökningen. Det innebär att du vidtar följande åtgärder:

  • Skapa en fulltextkatalog
  • Skapa en tom anpassad eller användardefinierad stopplista
  • Skapa ett fulltextindex

Skapa fulltextkatalog

Skapa en fulltextkatalog med följande skript:

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

Skapa en tom anpassad stopplista

Skapa en tom anpassad stopplista med följande skript:

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

En anpassad stopplista skapas nu.

Skapa fulltextindex

Slutligen, skapa ett fulltextindex i kolumnen Detaljer för det brittiska engelska språket. Den kommer att peka på den anpassade stopplistan som skapats tidigare. Använd följande T-SQL-skript för denna åtgärd:

-- 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  

Fulltextfråga för att få kundens betyg som utmärkt klocka

Kör följande fulltextfråga för att ta reda på vilken produkt (klocka) som fick utmärkta betyg av kunder:

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

Resultaten är nedan:

Vi kan se att kunder har gett utmärkta betyg till den svarta digitala klockan. Därför känner vi till den bästa produkten baserat på recensioner, och vi förstår att Full-Text Search fungerar bra.

Ändå finns det få problem som du kan ignorera för en tabell med fem rader, men det kan ge oss prestanda och lagringsfördelar i en relativt stor resultatuppsättning om den åtgärdas omgående.

Sök efter brusord "Hej" med fulltextfråga

Det finns många brusord kopplade till Full-Text-indexet. Snart kan de bli en börda. Dessutom har de ingen nytta av sökningen.

Låt oss kontrollera om brusordet Hej finns i fulltextsökningsresultaten eftersom det är bättre att utesluta det.

Kör fulltextfrågan enligt följande:

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

Resultaten är nedan:

Resultaten som returneras visar att ordet "Hej" är en del av fulltextsökresultaten. Därför måste vi utesluta det – det är meningslöst för sökningen och hjälper inte någon analys.

Ändra stopplista för att lägga till stoppord Hej

Vi lägger till stoppordet Hej genom att ändra vår anpassade stopplista så att den inte kan indexeras av fulltextsökning och inte bör returneras av fulltextfrågor för att spara utrymme och förbättra sökningen:

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

Sök efter brusordet "Hej" igen efter att ha lagt till det som stoppord

Sök efter brusordet Hej efter att ha lagt till det i stopplistan:

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

Utgången är som följer:

Kontrollera tillagda stoppord

Du kan när som helst kontrollera stopporden som lagts till i stopplistan. Kör följande skript för detta:

-- Check added stopwords 
SELECT * FROM sys.fulltext_stopwords

Resultaten är nedan:

Grattis! Du har skapat en stopplista och lagt till ett stoppord till den. På så sätt gör du fulltextsökningen mer effektiv i både prestanda och lagring.

Saker att göra

Nu när du kan skapa stopplistor och lägga till stoppord till dem kan du prova följande för att ytterligare förbättra dina kunskaper:

  • Lägg till orden "jag", "detta", "bara", "som brusord till din anpassade stopplista som skapats i den här genomgången.
  • Kontrollera de tillagda stopporden genom att köra skriptet vi angav i slutet av genomgången.

  1. Hur man uppdaterar vy i MySQL

  2. Returnera en lista över partitionsfunktioner i SQL Server (T-SQL)

  3. Hur man startar PostgreSQL Server på Mac OS X via Homebrew

  4. MySQL LN() Funktion – Returnera den naturliga logaritmen för ett tal