sql >> Database teknologi >  >> RDS >> Sqlserver

Mestring af brugen af ​​stoplister med SQL Server Full-Text Search (FTS)

Oprettelse og styring af stoplister fungerer som en af ​​hovedkomponenterne, der er ansvarlige for at forbedre fuldtekstsøgningens ydeevne sammen med at reducere størrelsen af ​​indekset. Denne artikel har til formål at hjælpe dig med at mestre jobbet i dybden og implementere flere strategier for at skabe stoplister over enkle, men interessante eksempler.

Vi vil også fremhæve betydningen af ​​forskellige metoder til at generere stoplister og afklare, hvordan man vælger den bedst egnede metode.

Hvorfor mestre stoplister

Når vi taler om at bruge stoplister vedrørende fuldtekstsøgning, er det første spørgsmål, hvorfor vi lærer så meget om disse stoplister. Svaret ligger i både de åbenlyse og skjulte fordele ved at bruge stoplister med fuldtekstsøgning. Der er også langsigtede gevinster, de kan give, når de er implementeret med succes.

Betydningen af ​​stoplister

En stopliste er en sprogspecifik komponent af fuldtekstsøgning, der indeholder brugerdefinerede eller systemleverede stopord. Den skal udelukke sådanne ord fra at blive en del af fuldtekstsøgning.

Et Full-Text Search-design uden en stopliste er ikke den optimale brug af sprogspecifikke komponenter, der burde forbedre Full-Text Search-effektiviteten og responstiden.

Forudsætninger

  1. Du kan skrive og køre T-SQL-scripts.
  2. Fuldtekstsøgning skal være installeret i din SQL Server-instans.
  3. Du er fortrolig med grundlæggende fuldtekstsøgningskoncepter og implementering.
  4. Du har grundlæggende viden om stopord og stopliste.

Hvis du mangler oplysningerne til at sikre ovenstående krav, henvises til nedenstående artikler:

  • Implementering af fuldtekstsøgning i SQL Server 2016 for begyndere
  • Implementering af fuldtekstsøgning i SQL Server 2016 for avancerede brugere
  • Sådan bruger du stopord og stopliste til at forbedre SQL Server Full-Text Search (FTS)

Flere strategier til oprettelse af stopliste

Der er mange forskellige metoder eller strategier, men nogle af dem er langt bedre end andre. Enhver databaseudvikler med færdigheder i implementering af fuld tekstsøgning bør være bekendt med alle metoderne til at vælge den bedste, når det kræves.

Den mest effektive måde at forstå disse forskellige strategier på er at anvende dem mod en prøvedatabase.

Opsæt prøvedatabase

Det første trin er at konfigurere databasen til at køre Full-Text-forespørgsler. Opret en eksempeldatabase kaldet 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

Oversigt over strategier for flere stoplister

Du kan bruge følgende tre måder/strategier til at oprette en stopliste og forhindre støjord i at blive en del af dine fuldtekstsøgningsforespørgsler:

  1. Opret en tilpasset stopliste
  2. Opret en systemstopliste
  3. Opret en stopliste fra en brugerdefineret (eller system) stopliste

Forudsætninger for stopliste

Husk, at før du opretter en stopliste, skal du gøre følgende:

  1. Opret et unikt indeks på en af ​​tabelkolonnerne, hvis der ikke er nogen tilgængelig nøglekolonne (primær nøgle).
  2. Opret et fuldtekstkatalog.
  3. Opret et fuldtekstindeks.

Opret en tilpasset stopliste

Antag, at et unikt indeks eller primær nøglekolonne er tilgængelig (som i vores eksempeldatabase). Vi opretter en tilpasset stopliste som følger:

  1. Opret et fuldtekstkatalog.
  2. Opret en tom brugerdefineret stopliste.
  3. Opret et fuldtekstindeks med den tilpassede stopliste oprettet i trin 2.

For detaljerede oplysninger henvises til artiklen Sådan bruges stopord og stopliste til at forbedre SQL Server Full-Text Search (FTS)

Fordele og ulemper ved tilpassede stoplister

Den største fordel ved at oprette en brugerdefineret stopliste er, at du kan have fuld kontrol over den og holde styr på den ved at tilføje og fjerne ord, som du mener er støjord.

Der er dog en ulempe ved at bruge denne tilgang. Stoplisten er meget begrænset, og den vil ikke inkludere de system anbefalede stopord for at forbedre ydeevnen for fuldtekstforespørgsler yderligere.

Oprettelse af en systemstopliste

Opret en systemstopliste (hvis den primære nøglekolonne eller det unikke indeks er angivet) som følger:

  1. Opret et fuldtekstkatalog.
  2. Opret et fuldtekstindeks med systemets stopliste.

Vi forbereder os på at bruge systemets stopliste ved først at oprette et fuldtekstkatalog:

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

Opret et fuldtekstindeks i kolonnen anmeldelser (Detaljer) i tabellen WatchReview med systemets stopliste. Brug følgende T-SQL-script:

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

Se stoplisten for engelsksproget system

Du kan se listen over stopord inkluderet i systemstoplisten for britisk engelsk. Kør følgende SQL-forespørgsel:

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

Outputtet er som følger:

Se de 3 mest seneste anmeldelser

Kør en hurtig kontrol mod den nyoprettede eksempeldatabase. Gør det ved at få de 3 seneste uranmeldelser fra WatchReview tabel:

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

Outputtet er som følger:

Kontrol af stopord ved at køre fuldtekstforespørgsler

Vi kan køre Full-Text-forespørgsler mod den nominerede tabel. Bliv ikke overrasket, hvis mange støjord (inkluderet i systemets stopliste for at forbedre ydeevnen) ikke dukker op i Full-Text-forespørgslerne. Det betyder, at vores systemstopliste gør sit arbejde korrekt.

Som vi kan se, er ordet 'dette' er til stede i top 3 anmeldelser. Det er dog et støjord, der i sig selv genkendes af systemets stopliste.

Lad os kontrollere, om en fuldtekstsøgning returnerer støjordet 'dette' inkluderet i systemets stopliste:

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

Resultatsættet er nedenfor:

Nu kan vi køre fuldtekstforespørgslen for at søge efter ordet 'er' hvilket er et andet støjord:

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

Forespørgselsoutputtet er nedenfor:

Vi kan se, at ordet "er" er også blevet forhindret i at blive en del af fuldtekstforespørgselsresultatet ved at spare værdifulde ressourcer.

Fuldtekstforespørgsel for at søge efter ordet "Hej"

Vi kører en fuldtekstforespørgsel for at søge efter ordet 'Hej.' Det er ikke en del af systemets stopliste. Derfor skal forespørgslen returnere den.

--Search Noise word 'Hi' 
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'Hi')

Outputtet er som følger:

Vi har alle optegnelser, der indeholder ordet 'Hej.' Vi vil dog gerne udelukke det, da det er et støjord. Hvis vi bruger fuldtekstsøgning i vores tekstanalyse, kan dette ord distrahere os fra målet.

Dette fører os til den tredje metode:oprettelse af en stopliste fra en brugerdefineret eller systemstopliste.

Oprettelse af en brugerdefineret stopliste fra systemstoplisten

Opret en tilpasset stopliste kaldet WatchMasterStoplist fra systemets stopliste med følgende T-SQL-script:

--Creating a custom stoplist WatchMasterStoplist from system stoplist 
CREATE FULLTEXT STOPLIST [WatchMasterStoplist] FROM SYSTEM STOPLIST;
GO

Tilknytning af en ny brugerdefineret stopliste med fuldtekstindeks

Tilknyt den nyoprettede brugerdefinerede stopliste med Full-Text-indekset som følger:

USE [WatchReviewsMasterStoplist]
GO
-- Associating new custom stoplist with Full-Text index
ALTER FULLTEXT INDEX ON [dbo].[WatchReview] SET STOPLIST = [WatchMasterStoplist]

Sådan tjekker du den tilpassede stopliste ved at søge efter Word 'this'

Du kan hurtigt tjekke, om din brugerdefinerede stopliste indeholder alle støjordene fra systemets stopliste. Kør den samme kode, som vi brugte tidligere til at søge efter ordet 'dette.'

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

Dette output skal være tomt.

Tilføjelse af et nyt støjord "Hej" til den brugerdefinerede stopliste

Vi skal tilføje støjordet 'Hej' til den nyoprettede brugerdefinerede stopliste. Kør følgende script:

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

Resultatsættet er nedenfor:

Det sidste tjek

Nu vil vi køre det sidste fuldtekst-forespørgselstjek for nogle støjord – vi sammenligner det med det originale resultatsæt, der indeholder disse støjord.

For eksempel, hvis vi fokuserer på den fjerde anmeldelse (ordnet efter ReviewId ), som indeholder nogle støjord, og derefter sammenligne resultaterne med fuldtekst-forespørgselsresultaterne, skulle vi ikke se nogen støjord.

Kør følgende script for at udføre den sidste kontrol mod prøvedatabasen:

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

Outputtet er som følger:

Fuldtekstforespørgsel for at søge efter anmeldelser af digitale ure

Nu kan vi køre vores Full-Text Search-forespørgsler med stoplisten på plads. Følgende T-SQL-script vil informere os om anmeldelser af digitale ure (eksempel):

USE WatchReviewsMasterStoplist

--Run Full-Text query to Search for digital watch reviews sample
SELECT * FROM dbo.WatchReview WHERE CONTAINS(Details,'digital')

Resultaterne er nedenfor:

Tillykke! Vi har med succes implementeret alle tre metoder til at oprette og tilknytte stoplister. Vi undersøgte også at tilføje nye ord til stoplister og kontrollere ydeevnen.

Alligevel anbefaler jeg stærkt den tredje metode. Opret en brugerdefineret stopliste fra en systemstopliste, og tilføj derefter støjord for at forbedre din fuldtekstsøgning.

Ting at gøre

Nu hvor du er udmærket klar over tre metoder til at oprette stoplister, kan du måske lave nogle øvelser for at forbedre dine tekstanalysefærdigheder, f.eks. følgende:

  1. Tilføj en tilpasset stopliste fra systemets stopliste mod prøvedatabasen, som i denne artikel.
  2. Opret en brugerdefineret stopliste fra systemets stopliste mod prøvedatabasen, som i denne artikel.
  3. Kør en T-SQL-forespørgsel for at se de tilføjede stopord, når du er blevet fortrolig med denne artikel.

  1. Hvordan fungerer det at hente data fra SQL Server til SqlDataReader?

  2. Måler du SQL Server-ydeevne med disse metrics?

  3. flyt data fra en tabel til en anden, postgresql edition

  4. CTE Recursion for at få træhierarki