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

Sådan bruger du stopord og stopliste til at forbedre SQL Server Full-Text Search (FTS)

Den aktuelle artikel handler om stopord og stoplistebrug. Målet er at gøre Full-Text Search mere effektiv med hensyn til opbevaring og ydeevne. Derudover vil læserne af denne artikel få en gennemgang af implementering af fuldtekstsøgning med stopord og stopliste.

Artiklen fremhæver også vigtigheden af ​​stopord og stopliste(r) for at holde fuldtekstsøgningen præcis og undgå støjord.

Forstå stopord og stopliste

Lad os først afklare essensen af ​​stopord og stopliste. Så fortsætter vi med at bruge dem til at forbedre fuldtekstsøgning.

En stopliste

En stopliste er, som navnet antyder, en liste over stopord. Når den er forbundet med fuldtekstsøgning, kan stoplisten filtrere meningsløse ord eller termer fra og dermed forbedre søgeresultaterne.

Et stopord

Et stopord er et ord, der har en mindre rolle i fuldtekstsøgning, på trods af at det er grammatisk vigtigt. Derfor er et stopord ikke nødvendigt fra Full-Text Search-perspektivet.

Ifølge Microsofts dokumentation kan et stopord være et ord med en vis betydning på et bestemt sprog, eller det kan være et symbol uden sproglig værdi. I begge tilfælde er det ubrugeligt for fuldtekstsøgning.

Eksempler på stopord

Følgende er stopord på det (britiske/amerikanske) engelske sprog:

  • som
  • være
  • fordi
  • han
  • gjorde

Da ovenstående ord ikke bidrager til fuldtekstsøgning, er de stopord, på trods af deres betydning for at forstå en hel sætning.

Systemstopliste(r)

Hvert understøttet sprog, inklusive britisk engelsk, har en standard- eller systemstopliste, der kan ændres i henhold til særlige krav.

Tilpassede stoplister

Brugere kan oprette deres egen/brugerdefinerede stopliste ved hjælp af systemets stopliste eller fra bunden. Det er nyttigt at forhindre støjord i at blive en del af fuldtekstsøgningsresultaterne.

Sprog og stoplister

Fuldtekstsøgning understøtter mange forskellige sprog. Hvert af de understøttede sprog har som standard mindst én systemstopliste. Der kan dog være flere stoplister for ethvert sprog, inklusive både system- og brugerdefinerede stoplister.

Liste over understøttede sprog

Vi kan hurtigt tjekke listen over alle understøttede sprog, der bruges med fuldtekstsøgning. Til dette skal du køre følgende T-SQL-script:

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

Resultaterne er som følger:

Forespørgslen på SQL Server 2016-instansen returnerer i alt 53 sprog.

Brug af stopord og stopliste med fuldtekstsøgning

Nu får vi nogle praktiske erfaringer med at oprette en stopliste over stopord defineret af brugeren. Derefter bruger vi det til fuldtekstsøgning som en gennemgang. Det vil være ligesom et realtidsscenarie.

Forudsætninger

Først og fremmest skal du sikre dig følgende krav for at implementere gennemgangen korrekt:

  • At have en grundlæggende forståelse af fuldtekstsøgning
  • Evnen til at implementere fuldtekstsøgning i SQL Server
  • Tilstedeværelsen af ​​Full-Text Search-indstillingen aktiveret/installeret på den SQL-instans, du planlægger at bruge

For at sikre disse forudsætninger skal du gennemgå nedenstående artikler, hvis du allerede er bekendt med T-SQL scripting:

  • Implementering af fuldtekstsøgning i SQL Server 2016 for begyndere
  • Implementering af fuldtekstsøgning i SQL Server 2016 for avancerede brugere

Tjek status for fuld tekstsøgning

Kør følgende forespørgsel for at kontrollere, om du har fuldtekstsøgning installeret i din SQL-instans:

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

Resultatet af ovenstående script skal returnere 1 som følger:

Hvis du får et andet tal end 1, skal du se artiklerne nævnt ovenfor igen.

Opsætning af prøvedatabase (WatchReviewsStoplist)

Først skal du opsætte en eksempeldatabase med navnet WatchReviewsStoplist . Brug nedenstående script:

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

Tjek prøvedatabase

Kør følgende T-SQL-script for at se tabelindholdet i eksempeldatabasen:

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

Outputtet er som følger:

Stoplistescenarie

Antag, at vi har bedt udviklingsteamet om at forbedre fuldtekstsøgningen for kundernes anmeldelser. De bør gøre det ved at udelukke støjord. På denne måde forbliver fuldtekstsøgningen effektiv og også fokuseret.

For at opfylde disse krav skal vi først konfigurere fuldtekstsøgning. Det betyder at tage følgende handlinger:

  • Opret et fuldtekstkatalog
  • Opret en tom brugerdefineret eller brugerdefineret stopliste
  • Opret et fuldtekstindeks

Opret fuldtekstkatalog

Opret et fuldtekstkatalog med følgende script:

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

Opret en tom brugerdefineret stopliste

Opret en tom brugerdefineret stopliste med følgende script:

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

En brugerdefineret stopliste er nu oprettet.

Opret fuldtekstindeks

Til sidst skal du oprette et fuldtekstindeks i kolonnen Detaljer for britisk engelsk. Det vil pege på den brugerdefinerede stopliste, der er oprettet tidligere. Brug følgende T-SQL-script til denne handling:

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

Fuldtekstforespørgsel for at få kunden vurderet som fremragende ur

Kør følgende fuldtekstforespørgsel for at finde ud af, hvilket produkt (ur) der fik fremragende karakterer af kunder:

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

Resultaterne er nedenfor:

Vi kan se, at kunderne har givet fremragende vurderinger til det sorte digitale ur. Derfor kender vi det bedste produkt baseret på anmeldelser, og vi forstår, at fuldtekstsøgning fungerer fint.

Alligevel er der få bekymringer, som du måske ignorerer for en tabel med fem rækker, men det kan give os ydeevne og lagringsfordele i et relativt stort resultatsæt, hvis det løses omgående.

Søg støjordet "Hej" med fuldtekstforespørgsel

Der er mange støjord knyttet til Full-Text-indekset. Snart kan de blive en byrde. Desuden nytter de ikke søgningen.

Lad os tjekke, om støjordet Hej er til stede i fuldtekstsøgningsresultaterne, fordi det er bedre at ekskludere det.

Kør fuldtekstforespørgslen som følger:

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

Resultaterne er nedenfor:

De returnerede resultater viser, at ordet "Hej" er en del af fuldtekstsøgeresultaterne. Derfor er vi nødt til at udelukke det – det er meningsløst for søgningen og hjælper ikke nogen analyse.

Rediger stopliste for at tilføje stopord Hi

Vi tilføjer stopordet Hej ved at ændre vores brugerdefinerede stopliste, så den ikke kan indekseres ved fuldtekstsøgning og ikke bør returneres af fuldtekstforespørgsler for at spare plads og forbedre søgningen:

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

Søg efter støjordet "Hej" igen efter at have tilføjet det som stopord

Søg efter støjordet Hej efter at have føjet det til stoplisten:

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

Outputtet er som følger:

Tjek tilføjede stopord

Du kan til enhver tid kontrollere de stopord, der er tilføjet til stoplisten. Kør følgende script til dette:

-- Check added stopwords 
SELECT * FROM sys.fulltext_stopwords

Resultaterne er nedenfor:

Tillykke! Du har oprettet en stopliste og tilføjet et stopord til den. På denne måde gør du fuldtekstsøgningen mere effektiv i både ydeevne og opbevaring.

Ting at gøre

Nu hvor du kan oprette stoplister og tilføje stopord til dem, kan du prøve følgende for at forbedre dine færdigheder yderligere:

  • Tilføj ordene 'jeg', 'dette', 'bare', 'som støjord til din brugerdefinerede stopliste, der er oprettet i denne gennemgang.
  • Tjek de tilføjede stopord ved at køre det script, vi specificerede i slutningen af ​​gennemgangen.

  1. MySQL/PHP-fejl:[2002] Kun én brug af hver socket-adresse (protokol/netværksadresse/port) er normalt tilladt

  2. INDSÆT I ... VÆLG FRA ... PÅ DUBLIKAT NØGLEOPDATERING

  3. Hvordan kan jeg tælle antallet af ord i en streng i Oracle?

  4. Sådan installeres, sikres og ydeevneindstilling af MariaDB-databaseserveren