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

Verwendung von Stoppwörtern und Stopplisten zur Verbesserung der SQL Server-Volltextsuche (FTS)

Der aktuelle Artikel befasst sich mit der Verwendung von Stoppwörtern und Stopplisten. Ziel ist es, die Volltextsuche in Bezug auf Speicher und Leistung effizienter zu gestalten. Darüber hinaus erhalten die Leser dieses Artikels eine exemplarische Vorgehensweise zur Implementierung der Volltextsuche mit Stoppwörtern und Stopplisten.

Der Artikel hebt auch die Bedeutung von Stoppwörtern und Stoppliste(n) hervor, um die Volltextsuche präzise zu halten und Füllwörter zu vermeiden.

Stoppwörter und Stoppliste verstehen

Lassen Sie uns zunächst die Essenz von Stoppwörtern und Stopplisten klären. Anschließend werden wir sie verwenden, um die Volltextsuche zu verbessern.

Eine Stoppliste

Eine Stoppliste ist, wie der Name schon sagt, eine Liste von Stoppwörtern. In Verbindung mit der Volltextsuche kann die Stoppliste bedeutungslose Wörter oder Begriffe herausfiltern und so die Suchergebnisse verbessern.

Ein Stoppwort

Ein Stoppwort ist ein Wort, das in der Volltextsuche eine untergeordnete Rolle spielt, obwohl es grammatikalisch wichtig ist. Daher ist ein Stoppwort aus Sicht der Volltextsuche nicht unbedingt erforderlich.

Laut Microsoft-Dokumentation kann ein Stoppwort ein Wort mit einer bestimmten Bedeutung in einer bestimmten Sprache oder ein Token ohne sprachlichen Wert sein. In beiden Fällen ist es für die Volltextsuche nutzlos.

Beispiele für Stoppwörter

Die folgenden sind Stoppwörter in der (britisch/amerikanischen) englischen Sprache:

  • als
  • bei
  • sein
  • weil
  • er
  • hat

Da die obigen Wörter nicht zur Volltextsuche beitragen, sind sie trotz ihrer Bedeutung für das Verständnis eines vollständigen Satzes Stoppwörter.

Systemstoppliste(n)

Jede unterstützte Sprache, einschließlich Britisches Englisch, hat eine Standard- oder System-Stoppliste, die je nach Bedarf geändert werden kann.

Benutzerdefinierte Stoppliste(n)

Benutzer können ihre eigene/benutzerdefinierte Stoppliste mithilfe der Systemstoppliste oder von Grund auf neu erstellen. Es ist hilfreich zu verhindern, dass Füllwörter Teil der Ergebnisse der Volltextsuche werden.

Sprachen und Stopplisten

Die Volltextsuche unterstützt viele verschiedene Sprachen. Jede der unterstützten Sprachen hat standardmäßig mindestens eine Systemstoppliste. Es kann jedoch mehrere Stopplisten für jede Sprache geben, einschließlich System- und benutzerdefinierter Stopplisten.

Liste der unterstützten Sprachen

Wir können schnell die Liste aller unterstützten Sprachen überprüfen, die mit der Volltextsuche verwendet werden. Führen Sie dazu das folgende T-SQL-Skript aus:

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

Die Ergebnisse lauten wie folgt:

Die Abfrage auf der SQL Server 2016-Instanz gibt insgesamt 53 Sprachen zurück.

Stoppwörter und Stoppliste mit Volltextsuche verwenden

Jetzt werden wir einige praktische Erfahrungen beim Erstellen einer Stoppliste mit Stoppwörtern sammeln, die vom Benutzer definiert werden. Dann verwenden wir es für die Volltextsuche als exemplarische Vorgehensweise. Es wird wie ein Echtzeit-Szenario sein.

Voraussetzungen

Zunächst müssen Sie die folgenden Anforderungen sicherstellen, um die exemplarische Vorgehensweise korrekt zu implementieren:

  • Grundlegendes Verständnis der Volltextsuche
  • Die Möglichkeit, die Volltextsuche in SQL Server zu implementieren
  • Das Vorhandensein der Option Volltextsuche, die auf der SQL-Instanz, die Sie verwenden möchten, aktiviert/installiert ist

Um diese Voraussetzungen sicherzustellen, gehen Sie die folgenden Artikel durch, wenn Sie bereits mit der T-SQL-Skripterstellung vertraut sind:

  • Implementieren der Volltextsuche in SQL Server 2016 für Anfänger
  • Implementieren der Volltextsuche in SQL Server 2016 für fortgeschrittene Benutzer

Überprüfen Sie den Status der Volltextsuche

Führen Sie die folgende Abfrage aus, um zu überprüfen, ob die Volltextsuche in Ihrer SQL-Instanz installiert ist:

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

Das Ergebnis des obigen Skripts sollte 1 wie folgt zurückgeben:

Wenn Sie eine andere Zahl als 1 erhalten, lesen Sie die oben genannten Artikel erneut.

Beispieldatenbank einrichten (WatchReviewsStoplist)

Zunächst müssen Sie eine Beispieldatenbank mit dem Namen WatchReviewsStoplist einrichten . Verwenden Sie das folgende Skript:

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

Beispieldatenbank prüfen

Führen Sie das folgende T-SQL-Skript aus, um den Tabelleninhalt in der Beispieldatenbank anzuzeigen:

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

Die Ausgabe sieht wie folgt aus:

Stopplisten-Szenario

Angenommen, wir haben das Entwicklungsteam gebeten, die Volltextsuche für die Bewertungen der Kunden zu verbessern. Sie sollten dies tun, indem sie Füllwörter ausschließen. So bleibt die Volltextsuche effizient und auch fokussiert.

Um diese Anforderungen zu erfüllen, müssen wir zunächst die Volltextsuche einrichten. Es bedeutet, die folgenden Maßnahmen zu ergreifen:

  • Erstellen Sie einen Volltextkatalog
  • Erstellen Sie eine leere benutzerdefinierte oder benutzerdefinierte Stoppliste
  • Erstellen Sie einen Volltextindex

Volltextkatalog erstellen

Erstellen Sie einen Volltextkatalog mit dem folgenden Skript:

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

Erstellen Sie eine leere benutzerdefinierte Stoppliste

Erstellen Sie mit dem folgenden Skript eine leere benutzerdefinierte Stoppliste:

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

Eine benutzerdefinierte Stoppliste wird jetzt erstellt.

Volltextindex erstellen

Erstellen Sie abschließend einen Volltextindex in der Spalte Details für die Sprache Britisches Englisch. Es zeigt auf die zuvor erstellte benutzerdefinierte Stoppliste. Verwenden Sie für diese Aktion das folgende T-SQL-Skript:

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

Volltextabfrage, um eine vom Kunden als ausgezeichnet bewertete Uhr zu erhalten

Führen Sie die folgende Volltextabfrage aus, um herauszufinden, welches Produkt (Uhr) von Kunden ausgezeichnet bewertet wurde:

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

Die Ergebnisse sind unten:

Wir sehen, dass die Kunden der schwarzen Digitaluhr hervorragende Bewertungen gegeben haben. Daher kennen wir das beste Produkt anhand von Bewertungen und verstehen, dass die Volltextsuche gut funktioniert.

Dennoch gibt es einige Bedenken, die Sie bei einer Tabelle mit fünf Zeilen ignorieren könnten, aber es kann uns Leistungs- und Speichervorteile in einer relativ großen Ergebnismenge bringen, wenn es umgehend behoben wird.

Suche Füllwort „Hi“ mit Volltextabfrage

An den Volltextindex sind viele Füllwörter angehängt. Bald können sie zur Belastung werden. Außerdem sind sie für die Suche nutzlos.

Lassen Sie uns prüfen, ob das Füllwort Hi in den Ergebnissen der Volltextsuche vorhanden ist, da es besser ist, sie auszuschließen.

Führen Sie die Volltextabfrage wie folgt aus:

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

Die Ergebnisse sind unten:

Die zurückgegebenen Ergebnisse zeigen, dass das Wort „Hi“ Teil der Volltext-Suchergebnisse ist. Daher müssen wir es ausschließen – es ist bedeutungslos für die Suche und hilft keiner Analyse.

Stoppliste ändern, um Stoppwort Hi hinzuzufügen

Wir fügen das Stoppwort Hi hinzu indem Sie unsere benutzerdefinierte Stoppliste so ändern, dass sie nicht von der Volltextsuche indiziert werden kann und nicht von Volltextabfragen zurückgegeben werden sollte, um Platz zu sparen und die Suche zu verbessern:

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

Suchen Sie das Füllwort „Hi“ erneut, nachdem Sie es als Stoppwort hinzugefügt haben

Suchen Sie nach dem Füllwort Hi, nachdem Sie es zur Stoppliste hinzugefügt haben:

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

Die Ausgabe sieht wie folgt aus:

Hinzugefügte Stoppwörter prüfen

Sie können die der Stoppliste hinzugefügten Stoppwörter jederzeit überprüfen. Führen Sie dazu das folgende Skript aus:

-- Check added stopwords 
SELECT * FROM sys.fulltext_stopwords

Die Ergebnisse sind unten:

Herzliche Glückwünsche! Sie haben erfolgreich eine Stoppliste erstellt und ihr ein Stoppwort hinzugefügt. Auf diese Weise machen Sie die Volltextsuche sowohl in der Leistung als auch im Speicher effizienter.

Dinge zu tun

Nachdem Sie jetzt Stopplisten erstellen und ihnen Stoppwörter hinzufügen können, versuchen Sie Folgendes, um Ihre Fähigkeiten weiter zu verbessern:

  • Fügen Sie Ihrer benutzerdefinierten Stoppliste, die in dieser exemplarischen Vorgehensweise erstellt wurde, die Wörter „ich“, „dies“, „gerade“ als Füllwörter hinzu.
  • Überprüfen Sie die hinzugefügten Stoppwörter, indem Sie das Skript ausführen, das wir am Ende der exemplarischen Vorgehensweise angegeben haben.