Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Beherrschen der Verwendung von Stopplisten mit der SQL Server-Volltextsuche (FTS)

Das Erstellen und Verwalten von Stopplisten ist neben der Reduzierung der Indexgröße eine der Hauptkomponenten, die für die Verbesserung der Leistung der Volltextsuche verantwortlich sind. Dieser Artikel soll Ihnen helfen, den Job gründlich zu meistern und mehrere Strategien zu implementieren, um Stopplisten anhand einfacher, aber interessanter Beispiele zu erstellen.

Wir werden auch die Bedeutung verschiedener Methoden zur Erstellung von Stopplisten hervorheben und erläutern, wie die am besten geeignete Methode ausgewählt wird.

Warum Stopplisten beherrschen

Wenn wir über die Verwendung von Stopplisten bei der Volltextsuche sprechen, ist die erste Frage, warum wir so viel über diese Stopplisten lernen. Die Antwort liegt in den offensichtlichen und versteckten Vorteilen der Verwendung von Stopplisten mit Volltextsuche. Es gibt auch langfristige Vorteile, die sie bringen können, sobald sie erfolgreich implementiert sind.

Bedeutung von Stopplisten

Eine Stoppliste ist eine sprachspezifische Komponente der Volltextsuche, die benutzerdefinierte oder vom System bereitgestellte Stoppwörter enthält. Es muss solche Wörter davon ausschließen, Teil der Volltextsuche zu werden.

Ein Design der Volltextsuche ohne Stoppliste ist nicht die optimale Nutzung sprachspezifischer Komponenten, die die Effizienz und Antwortzeit der Volltextsuche verbessern sollten.

Voraussetzungen

  1. Sie können T-SQL-Skripte schreiben und ausführen.
  2. Die Volltextsuche muss in Ihrer SQL Server-Instanz installiert sein.
  3. Sie sind mit den grundlegenden Konzepten und der Implementierung der Volltextsuche vertraut.
  4. Sie verfügen über Grundkenntnisse in Stoppwörtern und Stopplisten.

Falls Ihnen die Informationen fehlen, um die oben genannten Anforderungen zu erfüllen, lesen Sie die folgenden Artikel:

  • Implementieren der Volltextsuche in SQL Server 2016 für Anfänger
  • Implementieren der Volltextsuche in SQL Server 2016 für fortgeschrittene Benutzer
  • Verwendung von Stoppwörtern und Stopplisten zur Verbesserung der SQL Server-Volltextsuche (FTS)

Mehrere Strategien der Stopplistenerstellung

Es gibt viele verschiedene Methoden oder Strategien, aber einige von ihnen sind weitaus besser als andere. Jeder Datenbankentwickler mit den Fähigkeiten zur Implementierung der Volltextsuche sollte mit allen Methoden vertraut sein, um bei Bedarf die beste auszuwählen.

Der effektivste Weg, diese unterschiedlichen Strategien zu verstehen, besteht darin, sie auf eine Beispieldatenbank anzuwenden.

Beispieldatenbank einrichten

Der erste Schritt besteht darin, die Datenbank für die Ausführung von Volltextabfragen einzurichten. Erstellen Sie eine Beispieldatenbank namens 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

Mehrere Stopplisten-Strategien im Überblick

Sie können die folgenden drei Möglichkeiten/Strategien verwenden, um eine Stoppliste zu erstellen und zu verhindern, dass Füllwörter Teil Ihrer Volltextsuchabfragen werden:

  1. Erstellen Sie eine benutzerdefinierte Stoppliste
  2. Erstellen Sie eine Systemstoppliste
  3. Erstellen Sie eine Stoppliste aus einer benutzerdefinierten (oder System-)Stoppliste

Voraussetzungen für die Stoppliste

Denken Sie daran, dass Sie Folgendes tun müssen, bevor Sie eine Stoppliste erstellen:

  1. Erstellen Sie einen eindeutigen Index für eine der Tabellenspalten, wenn keine Schlüsselspalte verfügbar ist (Primärschlüssel).
  2. Erstellen Sie einen Volltextkatalog.
  3. Erstellen Sie einen Volltextindex.

Erstellen Sie eine benutzerdefinierte Stoppliste

Angenommen, ein eindeutiger Index oder eine Primärschlüsselspalte ist verfügbar (wie in unserer Beispieldatenbank). Wir erstellen eine benutzerdefinierte Stoppliste wie folgt:

  1. Erstellen Sie einen Volltextkatalog.
  2. Erstellen Sie eine leere benutzerdefinierte Stoppliste.
  3. Erstellen Sie einen Volltextindex mit der in Schritt 2 erstellten benutzerdefinierten Stoppliste.

Ausführliche Informationen finden Sie im Artikel Verwendung von Stoppwörtern und Stopplisten zur Verbesserung der SQL Server-Volltextsuche (FTS)

Vor- und Nachteile benutzerdefinierter Stopplisten

Der größte Vorteil beim Erstellen einer benutzerdefinierten Stoppliste besteht darin, dass Sie die vollständige Kontrolle darüber haben und den Überblick behalten können, indem Sie Wörter hinzufügen und entfernen, die Sie für Füllwörter halten.

Es gibt jedoch einen Nachteil bei der Verwendung dieses Ansatzes. Die Stoppliste ist sehr begrenzt und enthält nicht die vom System empfohlenen Stoppwörter, um die Leistung der Volltextabfragen weiter zu verbessern.

Erstellen einer Systemstoppliste

Erstellen Sie wie folgt eine Systemstoppliste (wenn die Primärschlüsselspalte oder der eindeutige Index bereitgestellt wird):

  1. Erstellen Sie einen Volltextkatalog.
  2. Erstellen Sie einen Volltextindex mit der Systemstoppliste.

Wir bereiten uns auf die Verwendung der Systemstoppliste vor, indem wir zuerst einen Volltextkatalog erstellen:

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

Erstellen Sie einen Volltextindex für die Rezensionsspalte (Details) der Tabelle WatchReview mit der Systemstoppliste. Verwenden Sie das folgende T-SQL-Skript:

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

Sehen Sie sich die Stoppliste des englischen Sprachsystems an

Sie können die Liste der Stoppwörter anzeigen, die in der System-Stoppliste für britisches Englisch enthalten sind. Führen Sie die folgende SQL-Abfrage aus:

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

Die Ausgabe sieht wie folgt aus:

Sehen Sie sich die Top 3 der neuesten Bewertungen an

Führen Sie eine schnelle Überprüfung der neu erstellten Beispieldatenbank durch. Tun Sie es, indem Sie die Top 3 der neusten Uhrenrezensionen von WatchReview abrufen Tabelle:

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

Die Ausgabe sieht wie folgt aus:

Überprüfen von Stoppwörtern durch Ausführen von Volltextabfragen

Wir können Volltextabfragen für die nominierte Tabelle ausführen. Seien Sie nicht überrascht, wenn viele Füllwörter (in der Systemstoppliste enthalten, um die Leistung zu verbessern) nicht in den Volltextabfragen auftauchen. Das bedeutet, dass unsere Systemstoppliste ihre Arbeit richtig macht.

Wie wir sehen können, das Wort ‘this’ ist in den Top 3 Bewertungen vertreten. Es ist jedoch ein Füllwort, das von der Systemstoppliste selbst erkannt wird.

Lassen Sie uns prüfen, ob eine Volltextsuche das Füllwort ‚this‘ zurückgibt in die Systemstoppliste aufgenommen:

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

Die Ergebnismenge ist unten:

Jetzt können wir die Volltextabfrage ausführen, um nach dem Wort ‘is‘ zu suchen das ist ein weiteres Füllwort:

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

Die Abfrageausgabe ist unten:

Wir können sehen, dass das Wort „is“ ist wurde auch erfolgreich daran gehindert, Teil des Ergebnisses der Volltextabfrage zu werden, indem wertvolle Ressourcen eingespart wurden.

Volltextabfrage zur Suche nach dem Wort „Hi“

Wir führen eine Volltextabfrage durch, um nach dem Wort „Hi.“ zu suchen Es ist kein Bestandteil der Systemstoppliste. Daher muss die Abfrage es zurückgeben.

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

Die Ausgabe sieht wie folgt aus:

Wir haben alle Aufzeichnungen, die das Wort ‘Hi.’ enthalten Wir möchten es jedoch ausschließen, da es sich um ein Füllwort handelt. Wenn wir die Volltextsuche in unserer Textanalyse verwenden, kann uns dieses Wort vom Ziel ablenken.

Dies führt uns zur dritten Methode:Erstellen einer Stoppliste aus einer benutzerdefinierten oder System-Stoppliste.

Erstellen einer benutzerdefinierten Stoppliste aus der Systemstoppliste

Erstellen Sie eine benutzerdefinierte Stoppliste namens WatchMasterStoplist aus der Systemstoppliste mit dem folgenden T-SQL-Skript:

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

Verknüpfen einer neuen benutzerdefinierten Stoppliste mit einem Volltextindex

Verknüpfen Sie die neu erstellte benutzerdefinierte Stoppliste wie folgt mit dem Volltextindex:

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

Überprüfen der benutzerdefinierten Stoppliste durch Suchen nach dem Wort „this“

Sie können schnell überprüfen, ob Ihre benutzerdefinierte Stoppliste alle Füllwörter aus der System-Stoppliste enthält. Führen Sie denselben Code aus, den wir zuvor verwendet haben, um nach dem Wort „this.“ zu suchen

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

Diese Ausgabe muss leer sein.

Hinzufügen eines neuen Füllworts „Hi“ zur benutzerdefinierten Stoppliste

Wir müssen das Füllwort ‘Hi’ hinzufügen zur neu erstellten benutzerdefinierten Stoppliste. Führen Sie das folgende Skript aus:

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

Die Ergebnismenge ist unten:

Die Endkontrolle

Jetzt führen wir die abschließende Volltext-Abfrageprüfung für einige Füllwörter durch – wir vergleichen sie mit der ursprünglichen Ergebnismenge, die diese Füllwörter enthält.

Wenn wir uns beispielsweise auf die vierte Bewertung konzentrieren (sortiert nach ReviewId ), die einige Füllwörter enthält, und dann die Ergebnisse mit den Ergebnissen der Volltextabfrage vergleichen, sollten wir keine Füllwörter sehen.

Führen Sie das folgende Skript aus, um die abschließende Prüfung mit der Beispieldatenbank durchzuführen:

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

Die Ausgabe sieht wie folgt aus:

Volltextabfrage zur Suche nach den Digitaluhren Bewertungen

Jetzt können wir unsere Volltextsuchabfragen mit der vorhandenen Stoppliste ausführen. Das folgende T-SQL-Skript informiert uns über die Bewertungen von Digitaluhren (Beispiel):

USE WatchReviewsMasterStoplist

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

Die Ergebnisse sind unten:

Herzliche Glückwünsche! Wir haben alle drei Methoden zum Erstellen und Zuordnen von Stopplisten erfolgreich implementiert. Wir haben auch das Hinzufügen neuer Wörter zu Stopplisten untersucht und die Leistung überprüft.

Trotzdem empfehle ich dringend die dritte Methode. Erstellen Sie eine benutzerdefinierte Stoppliste aus einer Systemstoppliste und fügen Sie dann Füllwörter hinzu, um Ihre Volltextsuche zu verbessern.

Dinge zu tun

Da Sie nun die drei Methoden zum Erstellen von Stopplisten gut kennen, könnten Sie einige Übungen machen, um Ihre Textanalysefähigkeiten zu verbessern, wie die folgenden:

  1. Fügen Sie eine benutzerdefinierte Stoppliste aus der Systemstoppliste gegen die Beispieldatenbank hinzu, wie in diesem Artikel.
  2. Erstellen Sie eine benutzerdefinierte Stoppliste aus der Systemstoppliste gegen die Beispieldatenbank, wie in diesem Artikel.
  3. Führen Sie eine T-SQL-Abfrage aus, um die hinzugefügten Stoppwörter anzuzeigen, nachdem Sie sich mit diesem Artikel vertraut gemacht haben.