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

Come utilizzare Stopwords e Stoplist per migliorare la ricerca full-text (FTS) di SQL Server

L'articolo corrente riguarda l'utilizzo di Stopwords e Stoplist. L'obiettivo è rendere la ricerca full-text più efficiente in termini di archiviazione e prestazioni. Inoltre, i lettori di questo articolo riceveranno una panoramica dell'implementazione della ricerca full-text con Stopwords e Stoplist.

L'articolo sottolinea anche l'importanza di Stopwords e Stoplist(s) per mantenere la ricerca full-text precisa ed evitare le parole non significative.

Capire le parole non significative e l'elenco delle parole non significative

Innanzitutto, chiariamo l'essenza di Stopwords e Stoplist. Quindi procederemo a utilizzarli per migliorare la ricerca full-text.

Una Stoplist

Una stoplist, come suggerisce il nome, è un elenco di stopword. Se associata alla ricerca full-text, la Stoplist può filtrare parole o termini privi di significato, migliorando così i risultati della ricerca.

Una parola d'ordine

Una stopword è una parola che ha un ruolo minore nella ricerca full-text, nonostante sia importante dal punto di vista grammaticale. Pertanto, una stopword non è essenziale dal punto di vista della ricerca full-text.

Secondo la documentazione Microsoft, una stopword può essere una parola con un significato in una lingua specifica oppure può essere un token senza valore linguistico. In entrambi i casi è inutile per la ricerca full-text.

Esempi di stopword

I seguenti sono stopword nella lingua inglese (britannica/americana):

  • come
  • a
  • essere
  • perché
  • lui
  • fatto

Poiché le parole di cui sopra non contribuiscono alla ricerca full-text, sono stopword, nonostante il loro significato nella comprensione di una frase completa.

Elenchi di stop di sistema

Ciascuna lingua supportata, incluso l'inglese britannico, ha una lista di stop predefinita o di sistema che può essere modificata in base a requisiti particolari.

Elenchi di stop personalizzati

Gli utenti possono creare la propria stoplist/personalizzata, utilizzando la stoplist di sistema o da zero. È utile evitare che le parole non significative diventino parte dei risultati della ricerca full-text.

Lingue e Stoplist

La ricerca full-text supporta molte lingue diverse. Ciascuna delle lingue supportate ha almeno un elenco di indirizzi non consentiti di sistema per impostazione predefinita. Tuttavia, possono esistere più liste di stop per qualsiasi lingua, incluse liste di stop personalizzate e di sistema.

Elenco delle lingue supportate

Possiamo controllare rapidamente l'elenco di tutte le lingue supportate utilizzate con la ricerca full-text. Per questo, esegui il seguente script T-SQL:

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

I risultati sono i seguenti:

La query sull'istanza di SQL Server 2016 restituisce un totale di 53 lingue.

Utilizzo di Stopword e Stoplist con la ricerca full-text

Ora faremo un'esperienza pratica nella creazione di un elenco di stopword definiti dall'utente. Quindi, lo useremo per la ricerca full-text come procedura dettagliata. Sarà proprio come uno scenario in tempo reale.

Prerequisiti

Prima di tutto, devi garantire i seguenti requisiti per implementare correttamente la procedura dettagliata:

  • Avere una conoscenza di base della ricerca full-text
  • La possibilità di implementare la ricerca full-text in SQL Server
  • La presenza dell'opzione di ricerca full-text abilitata/installata sull'istanza SQL che prevedi di utilizzare

Per garantire questi prerequisiti, consulta gli articoli seguenti se hai già familiarità con lo scripting T-SQL:

  • Implementazione della ricerca full-text in SQL Server 2016 per principianti
  • Implementazione della ricerca full-text in SQL Server 2016 per utenti avanzati

Controlla lo stato della ricerca full-text

Esegui la query seguente per verificare se la ricerca full-text è installata nell'istanza SQL:

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

Il risultato dello script precedente dovrebbe restituire 1 come segue:

Se stai ricevendo un numero diverso da 1, fai nuovamente riferimento agli articoli sopra menzionati.

Impostazione del database di esempio (WatchReviewsStoplist)

Innanzitutto, devi configurare un database di esempio denominato WatchReviewsStoplist . Usa lo script seguente:

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

Controlla database di esempio

Eseguire il seguente script T-SQL per visualizzare il contenuto della tabella nel database di esempio:

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

L'output è il seguente:

Scenario di stoplist

Supponiamo di aver chiesto al team di sviluppo di migliorare la ricerca full-text per le recensioni dei clienti. Dovrebbero farlo escludendo le parole non significative. In questo modo, la ricerca full-text rimane efficiente e anche mirata.

Per soddisfare questi requisiti, dobbiamo prima impostare la ricerca full-text. Significa intraprendere le seguenti azioni:

  • Crea un catalogo full-text
  • Crea una Stoplist vuota personalizzata o definita dall'utente
  • Crea un indice full-text

Crea catalogo full-text

Crea un catalogo full-text con il seguente script:

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

Crea una Stoplist personalizzata vuota

Crea una stoplist personalizzata vuota con il seguente script:

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

È stata creata una lista di stop personalizzata.

Crea indice full-text

Infine, crea un indice full-text nella colonna Dettagli per la lingua inglese britannica. Indicherà la stoplist personalizzata creata in precedenza. Utilizzare il seguente script T-SQL per questa azione:

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

Richiesta di testo completo per ottenere la valutazione di un orologio eccellente dai clienti

Esegui la seguente query di testo completo per scoprire quale prodotto (orologio) ha ottenuto ottimi voti dai clienti:

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

I risultati sono di seguito:

Possiamo vedere che i clienti hanno dato valutazioni eccellenti all'orologio digitale nero. Pertanto, conosciamo il miglior prodotto in base alle recensioni e comprendiamo che la ricerca full-text funziona correttamente.

Tuttavia, ci sono alcune preoccupazioni che potresti ignorare per una tabella di cinque righe, ma può darci vantaggi in termini di prestazioni e archiviazione in un set di risultati relativamente ampio se affrontato tempestivamente.

Cerca la parola non significativa "Ciao" con query full-text

Ci sono molte parole non significative allegate all'indice Full-Text. Presto, possono diventare un peso. Inoltre, non servono alla ricerca.

Controlliamo se la parola chiave Ciao è presente nei risultati della ricerca full-text perché è meglio escluderlo.

Eseguire la query full-text come segue:

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

I risultati sono di seguito:

I risultati restituiti mostrano che la parola "Ciao" fa parte dei risultati della ricerca full-text. Quindi, dobbiamo escluderlo:è privo di significato per la ricerca e non aiuta alcuna analisi.

Modifica Stoplist per aggiungere Stopword Ciao

Aggiungeremo la stopword Ciao alterando la nostra Stoplist personalizzata in modo che non possa essere indicizzata dalla ricerca full-text e non debba essere restituita da query full-text per risparmiare spazio e migliorare la ricerca:

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

Cerca di nuovo la parola non significativa "Ciao" dopo averla aggiunta come Stopword

Cerca la parola non significativa Ciao dopo averla aggiunta alla Stoplist:

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

L'output è il seguente:

Controlla le Stopword aggiunte

In qualsiasi momento, puoi controllare le stopword aggiunte alla Stoplist. Esegui il seguente script per questo:

-- Check added stopwords 
SELECT * FROM sys.fulltext_stopwords

I risultati sono di seguito:

Congratulazioni! Hai creato con successo una stoplist e hai aggiunto una stopword ad essa. In questo modo, rendi la ricerca full-text più efficiente sia in termini di prestazioni che di archiviazione.

Cose da fare

Ora che puoi creare liste non significative e aggiungervi parole non significative, prova quanto segue per migliorare ulteriormente le tue abilità:

  • Aggiungi le parole "io", "questo", "solo", "come parole non significative all'elenco delle parole non significative personalizzato creato in questa procedura dettagliata.
  • Controlla le stopword aggiunte eseguendo lo script che abbiamo specificato alla fine della procedura dettagliata.