sql >> Database >  >> RDS >> Sqlserver

Stopwoorden en Stoplist gebruiken om SQL Server Full-Text Search (FTS) te verbeteren

Het huidige artikel gaat over het gebruik van stopwoorden en stoplijsten. Het doel is om Full-Text Search efficiënter te maken in termen van opslag en prestaties. Bovendien krijgen de lezers van dit artikel uitleg over het implementeren van zoeken in volledige tekst met stopwoorden en stoplijst.

Het artikel benadrukt ook het belang van stopwoorden en stoplijst(en) om het zoeken in volledige tekst nauwkeurig te houden en ruiswoorden te vermijden.

Stopwoorden en stoplijsten begrijpen

Laten we eerst de essentie van stopwoorden en stoplijst verduidelijken. Daarna gaan we ze gebruiken om Full-Text Search te verbeteren.

Een stoplijst

Een stoplijst is, zoals de naam al aangeeft, een lijst met stopwoorden. In combinatie met Zoeken in volledige tekst kan de stoplijst zinloze woorden of termen uitfilteren, waardoor de zoekresultaten worden verbeterd.

Een stopwoord

Een stopwoord is een woord dat een ondergeschikte rol speelt bij zoeken in volledige tekst, ondanks dat het grammaticaal belangrijk is. Daarom is een stopwoord niet essentieel vanuit het perspectief van zoeken in volledige tekst.

Volgens Microsoft-documentatie kan een stopwoord een woord zijn met een bepaalde betekenis in een specifieke taal, of een token zonder taalkundige waarde. In beide gevallen is het nutteloos voor zoeken in volledige tekst.

Voorbeelden van stopwoorden

Hieronder volgen stopwoorden in de (Brits/Amerikaanse) Engelse taal:

  • als
  • om
  • wees
  • omdat
  • hij
  • deed

Aangezien de bovenstaande woorden niet bijdragen aan zoeken in volledige tekst, zijn het stopwoorden, ondanks hun betekenis voor het begrijpen van een volledige zin.

Systeemstoplijst(en)

Elke ondersteunde taal, inclusief Brits Engels, heeft een standaard- of systeemstoplijst die kan worden aangepast aan bepaalde vereisten.

Aangepaste stoplijst(en)

Gebruikers kunnen hun eigen/aangepaste stoplijst maken, met behulp van de systeemstoplijst, of helemaal opnieuw. Het is handig om te voorkomen dat ruiswoorden een onderdeel worden van de volledige tekstzoekresultaten.

Talen en stoplijsten

Zoeken in volledige tekst ondersteunt veel verschillende talen. Elk van de ondersteunde talen heeft standaard ten minste één systeemstoplijst. Er kunnen echter meerdere stoplijsten zijn voor elke taal, inclusief zowel systeem- als aangepaste stoplijsten.

Lijst met ondersteunde talen

We kunnen snel de lijst controleren van alle ondersteunde talen die worden gebruikt met Full-Text Search. Voer hiervoor het volgende T-SQL-script uit:

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

De resultaten zijn als volgt:

De query op de SQL Server 2016-instantie retourneert in totaal 53 talen.

Stopwoorden en stoplijsten gebruiken bij zoeken in volledige tekst

Nu zullen we wat praktische ervaring opdoen met het maken van een stoplijst met stopwoorden die door de gebruiker zijn gedefinieerd. Vervolgens gebruiken we het voor zoeken in volledige tekst als een walkthrough. Het zal net een realtime scenario zijn.

Vereisten

Allereerst moet u aan de volgende vereisten voldoen om de walkthrough correct te implementeren:

  • Een basiskennis hebben van zoeken in volledige tekst
  • De mogelijkheid om Full-Text Search in SQL Server te implementeren
  • De aanwezigheid van de optie Zoeken in volledige tekst ingeschakeld/geïnstalleerd op de SQL-instantie die u wilt gebruiken

Om aan deze vereisten te voldoen, kunt u de onderstaande artikelen doornemen als u al bekend bent met T-SQL-scripting:

  • Implementeren van zoeken in volledige tekst in SQL Server 2016 voor beginners
  • Implementeren van zoeken in volledige tekst in SQL Server 2016 voor geavanceerde gebruikers

Controleer de status van Zoeken in volledige tekst

Voer de volgende query uit om te controleren of u Full-Text Search in uw SQL-instantie hebt geïnstalleerd:

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

Het resultaat van het bovenstaande script zou als volgt 1 moeten retourneren:

Als u een ander nummer dan 1 krijgt, raadpleeg dan de hierboven genoemde artikelen opnieuw.

Stel voorbeelddatabase in (WatchReviewsStoplist)

Eerst moet u een voorbeelddatabase opzetten met de naam WatchReviewsStoplist . Gebruik het onderstaande 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

Controleer voorbeelddatabase

Voer het volgende T-SQL-script uit om de tabelinhoud in de voorbeelddatabase te bekijken:

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

De uitvoer is als volgt:

Stoplijstscenario

Stel dat we het ontwikkelteam hebben gevraagd om de Full-Text Search voor de beoordelingen van klanten te verbeteren. Ze zouden het moeten doen door ruiswoorden uit te sluiten. Op deze manier blijft Full-Text Search efficiënt en ook gericht.

Om aan deze vereisten te voldoen, moeten we eerst Full-Text Search instellen. Het betekent de volgende acties ondernemen:

  • Maak een volledige tekstcatalogus
  • Maak een lege aangepaste of door de gebruiker gedefinieerde stoplijst
  • Een volledige-tekstindex maken

Maak een volledige tekstcatalogus

Maak een full-text catalogus met het volgende script:

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

Maak een lege aangepaste stoplijst

Maak een lege aangepaste stoplijst met het volgende script:

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

Er is nu een aangepaste stoplijst gemaakt.

Maak een volledige tekstindex

Maak ten slotte een Full-Text Index in de kolom Details voor de Brits-Engelse taal. Het zal verwijzen naar de aangepaste stoplijst die eerder is gemaakt. Gebruik het volgende T-SQL-script voor deze actie:

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

Full-Text-query om een ​​door de klant beoordeeld uitstekend horloge te krijgen

Voer de volgende Full-Text-query uit om erachter te komen welk product (horloge) uitstekende cijfers heeft gekregen van klanten:

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

De resultaten staan ​​hieronder:

We kunnen zien dat klanten uitstekende beoordelingen hebben gegeven aan het zwarte digitale horloge. Daarom kennen we het beste product op basis van beoordelingen, en we begrijpen dat Full-Text Search prima werkt.

Toch zijn er weinig zorgen die u zou kunnen negeren voor een tabel van vijf rijen, maar het kan ons prestatie- en opslagvoordelen opleveren in een relatief grote resultatenset als het snel wordt aangepakt.

Zoek ruiswoord 'Hallo' met volledige tekstquery

Er zijn veel ruiswoorden aan de Full-Text index toegevoegd. Al snel kunnen ze een last worden. Bovendien hebben ze geen zin om te zoeken.

Laten we eens kijken of het ruiswoord Hallo is aanwezig in de Full-Text Search-resultaten omdat het beter is om het uit te sluiten.

Voer de volledige-tekstquery als volgt uit:

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

De resultaten staan ​​hieronder:

De geretourneerde resultaten laten zien dat het woord "Hallo" deel uitmaakt van de zoekresultaten in volledige tekst. We moeten het dus uitsluiten - het is zinloos voor het zoeken en helpt geen enkele analyse.

Wijzig stoplijst om stopwoord toe te voegen Hallo

We zullen het stopwoord Hallo . toevoegen door onze aangepaste stoplijst te wijzigen zodat deze niet kan worden geïndexeerd door zoeken in volledige tekst en niet moet worden geretourneerd door zoekopdrachten in volledige tekst om ruimte te besparen en de zoekopdracht te verbeteren:

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

Zoek het ruiswoord 'Hallo' opnieuw nadat u het als stopwoord hebt toegevoegd

Zoek naar het ruiswoord Hi nadat je het aan de stoplijst hebt toegevoegd:

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

De uitvoer is als volgt:

Controleer toegevoegde stopwoorden

U kunt op elk moment de stopwoorden controleren die aan de stoplijst zijn toegevoegd. Voer hiervoor het volgende script uit:

-- Check added stopwords 
SELECT * FROM sys.fulltext_stopwords

De resultaten staan ​​hieronder:

Gefeliciteerd! U hebt met succes een stoplijst gemaakt en er een stopwoord aan toegevoegd. Op deze manier maakt u zoeken in volledige tekst efficiënter, zowel qua prestaties als qua opslag.

Dingen om te doen

Nu u stoplijsten kunt maken en er stopwoorden aan kunt toevoegen, kunt u het volgende proberen om uw vaardigheden verder te verbeteren:

  • Voeg woorden 'ik', 'dit', 'gewoon' 'als ruiswoorden toe aan je aangepaste stoplijst die in deze walkthrough is gemaakt.
  • Controleer de toegevoegde stopwoorden door het script uit te voeren dat we aan het einde van de walkthrough hebben gespecificeerd.

  1. Typen SQL Server-cursor - Alleen doorsturen dynamische cursor | SQL Server-zelfstudie / TSQL-zelfstudie

  2. Dynamische update-instructie met variabele kolomnamen

  3. syntaxisfout bij het declareren van variabelen in een pl/sql-procedure

  4. Fix Toegang geweigerd voor gebruiker 'root'@'localhost' voor phpMyAdmin