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

Padroneggiare l'uso degli elenchi di stop con la ricerca full-text (FTS) di SQL Server

La creazione e la gestione di elenchi di stop costituisce uno dei componenti principali responsabili del miglioramento delle prestazioni della ricerca full-text oltre a ridurre le dimensioni dell'indice. Questo articolo mira ad aiutarti a padroneggiare il lavoro in modo approfondito e ad implementare più strategie per creare liste di stop su esempi semplici ma interessanti.

Evidenzieremo inoltre l'importanza di diversi metodi per generare elenchi di stop e chiariremo come scegliere il metodo più adatto.

Perché padroneggiare le Stoplist

Quando si parla dell'utilizzo delle liste di stop relative alla ricerca full-text, la prima domanda è perché impariamo così tanto su queste liste di stop. La risposta sta nei vantaggi evidenti e nascosti dell'utilizzo delle liste di stop con la ricerca full-text. Ci sono anche vantaggi a lungo termine che possono portare una volta implementati con successo.

Importanza delle Stoplist

Un elenco di indirizzi non consentiti è un componente specifico della lingua della ricerca di testo completo contenente parole non significative definite dall'utente o fornite dal sistema. Deve escludere tali parole dall'entrare a far parte della ricerca full-text.

Una progettazione di ricerca full-text senza una lista di stop non è l'uso ottimale di componenti specifici della lingua che dovrebbero migliorare l'efficienza della ricerca full-text e i tempi di risposta.

Prerequisiti

  1. Puoi scrivere ed eseguire script T-SQL.
  2. La ricerca full-text deve essere installata nell'istanza di SQL Server.
  3. Hai familiarità con i concetti e l'implementazione di base della ricerca full-text.
  4. Hai una conoscenza di base di stopword e stoplist.

Se non hai le informazioni per garantire i requisiti di cui sopra, fai riferimento agli articoli seguenti:

  • Implementazione della ricerca full-text in SQL Server 2016 per principianti
  • Implementazione della ricerca full-text in SQL Server 2016 per utenti avanzati
  • Come utilizzare Stopwords e Stoplist per migliorare la ricerca full-text (FTS) di SQL Server

Più strategie per la creazione di Stoplist

Ci sono molti metodi o strategie differenti, ma alcuni di essi sono di gran lunga migliori di altri. Qualsiasi sviluppatore di database con le capacità di implementazione della ricerca full-text dovrebbe avere familiarità con tutti i metodi per scegliere quello migliore quando richiesto.

Il modo più efficace per comprendere queste diverse strategie è applicarle a un database di esempio.

Imposta database di esempio

Il primo passaggio consiste nel configurare il database per l'esecuzione di query full-text. Crea un database di esempio chiamato 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

Panoramica sulle strategie per elenchi di stop multipli

Puoi utilizzare i tre modi/strategie seguenti per creare una lista di stop e impedire che le parole non significative diventino parte delle tue query di ricerca full-text:

  1. Crea una stoplist personalizzata
  2. Crea una lista di stop di sistema
  3. Crea una stoplist da una stoplist personalizzata (o di sistema)

Prerequisiti per le liste di arresto

Ricorda che prima di creare una stoplist, devi fare quanto segue:

  1. Crea un indice univoco su una delle colonne della tabella se non è disponibile una colonna chiave (Chiave primaria).
  2. Crea un catalogo full-text.
  3. Crea un indice full-text.

Crea una Stoplist personalizzata

Si supponga che sia disponibile un indice univoco o una colonna di chiave primaria (come nel nostro database di esempio). Creiamo una stoplist personalizzata come segue:

  1. Crea un catalogo full-text.
  2. Crea una stoplist personalizzata vuota.
  3. Crea un indice full-text con la stoplist personalizzata creata nel passaggio 2.

Per informazioni dettagliate, fare riferimento all'articolo Come utilizzare Stopwords e Stoplist per migliorare la ricerca full-text (FTS) di SQL Server

Pro e contro delle Stoplist personalizzate

Il più grande vantaggio della creazione di una stoplist personalizzata è che puoi avere il pieno controllo su di essa e tenerne traccia aggiungendo e rimuovendo parole che ritieni siano parole non significative.

C'è uno svantaggio nell'usare questo approccio, però. L'elenco delle interruzioni è molto limitato e non include le parole non significative consigliate dal sistema per migliorare ulteriormente le prestazioni delle query full-text.

Creazione di una Stoplist di sistema

Crea una lista di stop di sistema (se viene fornita la colonna della chiave primaria o l'indice univoco) come segue:

  1. Crea un catalogo full-text.
  2. Crea un indice full-text con la stoplist di sistema.

Ci prepariamo a utilizzare la stoplist di sistema creando prima un catalogo full-text:

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

Crea un indice full-text nella colonna delle recensioni (Dettagli) della tabella WatchReview con la lista delle fermate di sistema. Utilizzare il seguente script T-SQL:

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

Visualizza la Stoplist del sistema di lingua inglese

È possibile visualizzare l'elenco delle parole non significative incluse nell'elenco delle parole non significative di sistema dell'inglese britannico. Esegui la seguente query SQL:

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

L'output è il seguente:

Visualizza le prime 3 recensioni più recenti

Eseguire un rapido controllo sul database di esempio appena creato. Fallo ricevendo le prime 3 recensioni di orologi più recenti da WatchReview tabella:

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

L'output è il seguente:

Controllo delle stopword eseguendo query full-text

Possiamo eseguire query full-text sulla tabella nominata. Non sorprenderti se molte parole non significative (incluse nella stoplist di sistema per migliorare le prestazioni) non vengono visualizzate nelle query di testo completo. Significa che la nostra stoplist di sistema sta facendo il suo lavoro correttamente.

Come possiamo vedere, la parola 'questo' è presente nelle prime 3 recensioni. Tuttavia, è essa stessa una parola non valida riconosciuta dalla stoplist di sistema.

Verifichiamo se una ricerca full-text restituisce la parola non significativa "questo" incluso nella stoplist di sistema:

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

Il set di risultati è il seguente:

Ora possiamo eseguire la query full-text per cercare la parola 'è' che è un'altra parolaccia:

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

L'output della query è di seguito:

Possiamo vedere che la parola "è" è stato anche impedito con successo di entrare a far parte del risultato della query full-text risparmiando risorse preziose.

Query full-text per cercare la parola "Ciao"

Eseguiamo una query full-text per cercare la parola "Ciao". Non fa parte della stoplist di sistema. Pertanto, la query deve restituirla.

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

L'output è il seguente:

Abbiamo tutti i record contenenti la parola "Ciao". Tuttavia, vorremmo escluderlo, poiché è una parolaccia. Se utilizziamo la ricerca full-text nella nostra analisi testuale, questa parola potrebbe distrarci dall'obiettivo.

Questo ci porta al terzo metodo:creare una stoplist da una stoplist personalizzata o di sistema.

Creazione di una Stoplist personalizzata dalla Stoplist di sistema

Crea una lista delle fermate personalizzate chiamata WatchMasterStoplist dalla stoplist di sistema con il seguente script T-SQL:

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

Associazione di una nuova Stoplist personalizzata con l'indice full-text

Associa la stoplist personalizzata appena creata all'indice full-text come segue:

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

Controllo della Stoplist personalizzata cercando la parola "questo"

Puoi controllare rapidamente se la tua lista delle fermate personalizzate include tutte le parole non significative dalla lista delle fermate del sistema. Esegui lo stesso codice che abbiamo usato in precedenza per cercare la parola "questo".

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

Questo output deve essere vuoto.

Aggiunta di una nuova parola non significativa "Ciao" all'elenco delle interruzioni personalizzate

Dobbiamo aggiungere la parola non comune 'Ciao' alla nuova stoplist personalizzata. Esegui il seguente script:

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

Il set di risultati è il seguente:

Il controllo finale

Ora eseguiremo il controllo finale della query full-text per alcune parole non significative:lo confrontiamo con il set di risultati originale contenente quelle parole non significative.

Ad esempio, se ci concentriamo sulla quarta recensione (ordinata per ReviewId ), che contiene alcune parole non significative, quindi confronta i risultati con i risultati della query full-text, non dovremmo vedere parole non significative.

Eseguire lo script seguente per eseguire il controllo finale sul database di esempio:

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

L'output è il seguente:

Query full-text per cercare le recensioni di orologi digitali

Ora possiamo eseguire le nostre query di ricerca full-text con l'elenco di stop attivo. Il seguente script T-SQL ci informerà sulle recensioni di orologi digitali (campione):

USE WatchReviewsMasterStoplist

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

I risultati sono di seguito:

Congratulazioni! Abbiamo implementato con successo tutti e tre i metodi per creare e associare le liste di stop. Abbiamo anche esaminato l'aggiunta di nuove parole alle stoplist e il controllo delle prestazioni.

Tuttavia, consiglio vivamente il terzo metodo. Crea una stoplist personalizzata da una stoplist di sistema, quindi aggiungi parole non significative per migliorare la tua ricerca full-text.

Cose da fare

Ora che conosci bene tre metodi per creare elenchi di stop, potresti fare alcuni esercizi per migliorare le tue capacità di analisi testuale, come i seguenti:

  1. Aggiungi una lista di fermate personalizzate dalla lista di fermate di sistema rispetto al database di esempio, come in questo articolo.
  2. Crea una stoplist personalizzata dalla stoplist di sistema rispetto al database di esempio, come in questo articolo.
  3. Esegui una query T-SQL per vedere le stopword aggiunte dopo aver acquisito familiarità con questo articolo.