sql >> Database >  >> RDS >> Sqlserver

Beheers het gebruik van stoplijsten met SQL Server Full-Text Search (FTS)

Het maken en beheren van stoplijsten is een van de belangrijkste componenten die verantwoordelijk zijn voor het verbeteren van de prestaties van Full-Text Search naast het verkleinen van de index. Dit artikel is bedoeld om u te helpen het werk grondig onder de knie te krijgen en meerdere strategieën te implementeren om stoplijsten te maken op basis van eenvoudige maar interessante voorbeelden.

We zullen ook het belang benadrukken van verschillende methoden om stoplijsten te genereren en verduidelijken hoe de meest geschikte methode te kiezen.

Waarom stoplijsten beheersen

Als we het hebben over het gebruik van stoplijsten met betrekking tot Full-Text Search, is de eerste vraag waarom we zoveel leren over deze stoplijsten. Het antwoord ligt in zowel de duidelijke als verborgen voordelen van het gebruik van stoplijsten met Full-Text Search. Er zijn ook voordelen op de lange termijn die ze kunnen opleveren als ze eenmaal succesvol zijn geïmplementeerd.

Belang van stoplijsten

Een stoplijst is een taalspecifiek onderdeel van Zoeken in volledige tekst met door de gebruiker gedefinieerde of door het systeem geleverde stopwoorden. Het moet dergelijke woorden uitsluiten om deel uit te maken van Full-Text Search.

Een ontwerp voor zoeken in volledige tekst zonder stoplijst is niet het optimale gebruik van taalspecifieke componenten die de efficiëntie en responstijd van zoeken in volledige tekst zouden moeten verbeteren.

Vereisten

  1. U kunt T-SQL-scripts schrijven en uitvoeren.
  2. Full-Text Search moet in uw SQL Server-instantie zijn geïnstalleerd.
  3. Je bent bekend met de basisconcepten en implementatie van zoeken in volledige tekst.
  4. Je hebt basiskennis van stopwoorden en stoplijsten.

Als u niet over de informatie beschikt om aan de bovenstaande vereisten te voldoen, raadpleeg dan de onderstaande artikelen:

  • 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
  • Stopwoorden en stoplijst gebruiken om SQL Server Full-Text Search (FTS) te verbeteren

Meerdere strategieën voor het maken van een stoplijst

Er zijn veel verschillende methoden of strategieën, maar sommige zijn veel beter dan andere. Elke databaseontwikkelaar met de implementatievaardigheden van Full-Text Search moet bekend zijn met alle methoden om indien nodig de beste te kiezen.

De meest effectieve manier om deze verschillende strategieën te begrijpen, is door ze toe te passen op een voorbeelddatabase.

Voorbeelddatabase instellen

De eerste stap is het instellen van de database om Full-Text-query's uit te voeren. Maak een voorbeelddatabase met de naam 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

Overzicht meerdere stoplijststrategieën

U kunt de volgende drie manieren/strategieën gebruiken om een ​​stoplijst te maken en te voorkomen dat ruiswoorden een onderdeel worden van uw zoekopdrachten in volledige tekst:

  1. Maak een aangepaste stoplijst
  2. Maak een systeemstoplijst
  3. Maak een stoplijst van een aangepaste (of systeem) stoplijst

Vereisten voor stoplijst

Onthoud dat u het volgende moet doen voordat u een stoplijst maakt:

  1. Maak een unieke index op een van de tabelkolommen als er geen sleutelkolom beschikbaar is (primaire sleutel).
  2. Maak een volledige tekstcatalogus.
  3. Maak een volledige tekstindex.

Maak een aangepaste stoplijst

Stel dat er een unieke index- of primaire-sleutelkolom beschikbaar is (zoals in onze voorbeelddatabase). We maken als volgt een aangepaste stoplijst:

  1. Maak een volledige tekstcatalogus.
  2. Maak een lege aangepaste stoplijst.
  3. Maak een volledige tekstindex met de aangepaste stoplijst die in stap 2 is gemaakt.

Raadpleeg voor gedetailleerde informatie het artikel Stopwords en Stoplist gebruiken om SQL Server Full-Text Search (FTS) te verbeteren

Voor- en nadelen van aangepaste stoplijsten

Het grootste voordeel van het maken van een aangepaste stoplijst is dat u er volledige controle over heeft en deze kunt bijhouden door woorden toe te voegen en te verwijderen waarvan u denkt dat het ruiswoorden zijn.

Er is echter een nadeel aan het gebruik van deze benadering. De stoplijst is zeer beperkt en bevat niet de door het systeem aanbevolen stopwoorden om de prestaties van volledige tekstquery's verder te verbeteren.

Een systeemstoplijst maken

Maak als volgt een systeemstoplijst (als de primaire sleutelkolom of unieke index is opgegeven):

  1. Maak een volledige tekstcatalogus.
  2. Maak een volledige tekstindex met de systeemstoplijst.

We bereiden ons voor op het gebruik van de systeemstoplijst door eerst een volledige tekstcatalogus te maken:

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

Maak een Full-Text Index op de recensiekolom (Details) van de tabel WatchReview met de systeemstoplijst. Gebruik het volgende 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  

Bekijk de stoplijst van het Engelse taalsysteem

U kunt de lijst met stopwoorden bekijken die zijn opgenomen in de systeemstoplijst van Brits Engels. Voer de volgende SQL-query uit:

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

De uitvoer is als volgt:

Bekijk de top 3 van meest recente beoordelingen

Voer een snelle controle uit met de nieuw gemaakte voorbeelddatabase. Doe het door de top 3 van meest recente horlogerecensies te krijgen van de WatchReview tafel:

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

De uitvoer is als volgt:

Stopwoorden controleren door volledige tekstquery's uit te voeren

We kunnen Full-Text-query's uitvoeren op de genomineerde tabel. Wees niet verbaasd als veel ruiswoorden (opgenomen in de systeemstoplijst om de prestaties te verbeteren) niet verschijnen in de Full-Text-query's. Het betekent dat onze systeemstoplijst zijn werk goed doet.

Zoals we kunnen zien, is het woord 'dit' staat in de top 3 reviews. Het is echter een ruiswoord dat zelf wordt herkend door de systeemstoplijst.

Laten we controleren of een zoekopdracht in volledige tekst het ruiswoord 'this' . oplevert opgenomen in de systeemstoplijst:

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

De resultatenset staat hieronder:

Nu kunnen we de Full-Text-query uitvoeren om te zoeken naar het woord ‘is’ wat een ander ruiswoord is:

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

De uitvoer van de query is hieronder:

We kunnen zien dat het woord 'is' is ook met succes voorkomen dat het een onderdeel wordt van het volledige tekstzoekresultaat door waardevolle bronnen te besparen.

Full-Text zoekopdracht om te zoeken naar het woord 'Hallo'

We voeren een volledige tekstzoekopdracht uit om te zoeken naar het woord 'Hallo' Het maakt geen deel uit van de systeemstoplijst. De query moet deze dus retourneren.

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

De uitvoer is als volgt:

We hebben alle records met het woord 'Hallo' We willen het echter uitsluiten, omdat het een ruiswoord is. Als we Full-Text Search gebruiken in onze tekstanalyse, kan dit woord ons afleiden van het doel.

Dit leidt ons naar de derde methode:een stoplijst maken op basis van een aangepaste of systeemstoplijst.

Een aangepaste stoplijst maken van de systeemstoplijst

Maak een aangepaste stoplijst met de naam WatchMasterStoplist uit de systeemstoplijst met het volgende T-SQL-script:

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

Een nieuwe aangepaste stoplijst koppelen aan een volledige tekstindex

Koppel de nieuw gemaakte aangepaste stoplijst als volgt aan de Full-Text index:

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

De aangepaste stoplijst controleren door te zoeken naar het woord 'this'

U kunt snel controleren of uw aangepaste stoplijst alle ruiswoorden van de systeemstoplijst bevat. Voer dezelfde code uit die we eerder gebruikten om te zoeken naar het woord 'this.'

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

Deze uitvoer moet leeg zijn.

Een nieuw ruiswoord 'Hallo' toevoegen aan de aangepaste stoplijst

We moeten het ruiswoord 'Hallo' . toevoegen naar de nieuw gemaakte aangepaste stoplijst. Voer het volgende script uit:

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

De resultatenset staat hieronder:

De laatste controle

Nu zullen we de laatste Full-Text-querycontrole uitvoeren voor enkele ruiswoorden - we vergelijken deze met de originele resultatenset die deze ruiswoorden bevat.

Als we ons bijvoorbeeld concentreren op de vierde recensie (in volgorde van ReviewId ), die wel enkele ruiswoorden bevat, en vergelijk de resultaten met de resultaten van de volledige tekstzoekopdracht, we zouden geen ruiswoorden moeten zien.

Voer het volgende script uit om de laatste controle uit te voeren met de voorbeelddatabase:

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

De uitvoer is als volgt:

Full-Text zoekopdracht om te zoeken naar de beoordelingen van digitale horloges

Nu kunnen we onze zoekopdrachten voor volledige tekst uitvoeren met de stoplijst op zijn plaats. Het volgende T-SQL-script zal ons informeren over de beoordelingen van digitale horloges (voorbeeld):

USE WatchReviewsMasterStoplist

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

De resultaten staan ​​hieronder:

Gefeliciteerd! We hebben alle drie de methoden voor het maken en koppelen van stoplijsten met succes geïmplementeerd. We hebben ook gekeken naar het toevoegen van nieuwe woorden aan stoplijsten en het controleren van de uitvoering.

Toch raad ik de derde methode ten zeerste aan. Maak een aangepaste stoplijst van een systeemstoplijst en voeg vervolgens ruiswoorden toe om uw zoekopdracht in volledige tekst te verbeteren.

Dingen om te doen

Nu u goed op de hoogte bent van drie methoden voor het maken van stoplijsten, kunt u enkele oefeningen doen om uw tekstuele analysevaardigheden te verbeteren, zoals de volgende:

  1. Voeg een aangepaste stoplijst van de systeemstoplijst toe aan de voorbeelddatabase, zoals in dit artikel.
  2. Maak een aangepaste stoplijst van de systeemstoplijst op basis van de voorbeelddatabase, zoals in dit artikel.
  3. Voer een T-SQL-query uit om de toegevoegde stopwoorden te zien nadat u vertrouwd bent geraakt met dit artikel.

  1. Hoe een Auto Increment Primary Key in Oracle te definiëren

  2. Alleen een tabel maken als deze niet in SQLite bestaat

  3. Hoe datetime te vergelijken met alleen datum in SQL Server

  4. Schaaloplossingen voor MySQL (replicatie, clustering)