Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Maîtriser l'utilisation des listes de mots vides avec la recherche en texte intégral SQL Server (FTS)

La création et la gestion des listes de mots vides constituent l'un des principaux composants responsables de l'amélioration des performances de la recherche en texte intégral tout en réduisant la taille de l'index. Cet article vise à vous aider à maîtriser le travail en profondeur et à mettre en œuvre plusieurs stratégies pour créer des listes d'arrêt sur des exemples simples mais intéressants.

Nous soulignerons également l'importance des différentes méthodes pour générer des listes de mots vides et clarifierons comment choisir la méthode la plus appropriée.

Pourquoi maîtriser les listes d'arrêt

Lorsque nous parlons d'utiliser des listes de mots vides concernant la recherche en texte intégral, la première question est de savoir pourquoi nous en apprenons tant sur ces listes de mots vides. La réponse réside dans les avantages évidents et cachés de l'utilisation de listes de mots vides avec la recherche en texte intégral. Il y a aussi des gains à long terme qu'ils peuvent apporter une fois mis en œuvre avec succès.

Importance des listes de mots vides

Une liste de mots vides est un composant spécifique à la langue de la recherche en texte intégral contenant des mots vides définis par l'utilisateur ou fournis par le système. Il doit exclure que ces mots fassent partie de la recherche en texte intégral.

Une conception de recherche en texte intégral sans liste de mots vides n'est pas l'utilisation optimale des composants spécifiques à la langue qui devraient améliorer l'efficacité et le temps de réponse de la recherche en texte intégral.

Prérequis

  1. Vous pouvez écrire et exécuter des scripts T-SQL.
  2. La recherche en texte intégral doit être installée sur votre instance SQL Server.
  3. Vous connaissez les concepts de base de la recherche en texte intégral et leur mise en œuvre.
  4. Vous avez une connaissance de base des mots vides et des listes vides.

Si vous ne disposez pas des informations nécessaires pour répondre aux exigences ci-dessus, reportez-vous aux articles ci-dessous :

  • Mise en œuvre de la recherche en texte intégral dans SQL Server 2016 pour les débutants
  • Mise en œuvre de la recherche en texte intégral dans SQL Server 2016 pour les utilisateurs avancés
  • Comment utiliser les mots vides et la liste de mots vides pour améliorer la recherche en texte intégral (FTS) de SQL Server

Plusieurs stratégies de création de listes de mots vides

Il existe de nombreuses méthodes ou stratégies différentes, mais certaines d'entre elles sont bien meilleures que d'autres. Tout développeur de base de données ayant des compétences en implémentation de la recherche en texte intégral doit être familiarisé avec toutes les méthodes pour choisir la meilleure en cas de besoin.

Le moyen le plus efficace de comprendre ces différentes stratégies est de les appliquer à un exemple de base de données.

Configurer une base de données exemple

La première étape consiste à configurer la base de données pour exécuter des requêtes de texte intégral. Créez un exemple de base de données appelé 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

Aperçu des stratégies de listes d'arrêt multiples

Vous pouvez utiliser les trois méthodes/stratégies suivantes pour créer une liste de mots vides et empêcher les mots parasites de faire partie de vos requêtes de recherche en texte intégral :

  1. Créer une liste de mots vides personnalisée
  2. Créer une liste de mots vides système
  3. Créer une liste de mots vides à partir d'une liste de mots vides personnalisée (ou système)

Prérequis pour la liste de mots vides

N'oubliez pas qu'avant de créer une liste de mots vides, vous devez effectuer les opérations suivantes :

  1. Créer un index unique sur l'une des colonnes de la table s'il n'y a pas de colonne de clé disponible (clé primaire).
  2. Créer un catalogue de texte intégral.
  3. Créer un index de texte intégral.

Créer une liste de mots vides personnalisée

Supposons qu'un index unique ou une colonne de clé primaire soit disponible (comme dans notre exemple de base de données). Nous créons une liste de mots vides personnalisée comme suit :

  1. Créer un catalogue de texte intégral.
  2. Créez une liste d'arrêt personnalisée vide.
  3. Créez un index de texte intégral avec la liste de mots vides personnalisée créée à l'étape 2.

Pour des informations détaillées, reportez-vous à l'article Comment utiliser les mots vides et la liste de mots vides pour améliorer la recherche en texte intégral (FTS) de SQL Server

Avantages et inconvénients des listes d'arrêt personnalisées

Le plus grand avantage de la création d'une liste de mots vides personnalisée est que vous pouvez en avoir le contrôle total et en garder une trace en ajoutant et en supprimant des mots que vous pensez être des mots parasites.

Il y a cependant un inconvénient à utiliser cette approche. La liste de mots vides est très limitée et n'inclura pas les mots vides recommandés par le système pour améliorer davantage les performances des requêtes de texte intégral.

Création d'une liste de mots vides système

Créez une liste de mots vides système (si la colonne de clé primaire ou l'index unique est fourni) comme suit :

  1. Créer un catalogue de texte intégral.
  2. Créer un index de texte intégral avec la liste de mots vides du système.

Nous nous préparons à utiliser la liste de mots vides du système en créant d'abord un catalogue de texte intégral :

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

Créez un index de texte intégral sur la colonne des avis (Détails) de la table WatchReview avec la liste de mots vides du système. Utilisez le script T-SQL suivant :

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

Afficher la liste d'arrêt du système de langue anglaise

Vous pouvez afficher la liste des mots vides inclus dans la liste de mots vides du système de l'anglais britannique. Exécutez la requête SQL suivante :

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

Le résultat est le suivant :

Afficher les 3 avis les plus récents

Exécutez une vérification rapide par rapport à l'exemple de base de données nouvellement créé. Faites-le en obtenant les 3 meilleures critiques de montres les plus récentes de la WatchReview tableau :

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

Le résultat est le suivant :

Vérification des mots vides en exécutant des requêtes de texte intégral

Nous pouvons exécuter des requêtes de texte intégral sur la table désignée. Ne soyez pas surpris si de nombreux mots parasites (inclus dans la liste de mots vides du système pour améliorer les performances) n'apparaissent pas dans les requêtes de texte intégral. Cela signifie que notre liste de mots vides système fait correctement son travail.

Comme nous pouvons le voir, le mot "ceci" est présent dans le top 3 des avis. Cependant, c'est un mot parasite lui-même reconnu par la liste de mots vides du système.

Vérifions si une recherche en texte intégral renvoie le mot parasite "ceci" inclus dans la liste d'arrêt du système :

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

Le jeu de résultats est ci-dessous :

Nous pouvons maintenant exécuter la requête de texte intégral pour rechercher le mot 'is' qui est un autre mot de bruit :

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

Le résultat de la requête est ci-dessous :

Nous pouvons voir que le mot "est" a également été empêché avec succès de faire partie du résultat de la requête de texte intégral en économisant des ressources précieuses.

Requête en texte intégral pour rechercher le mot "Salut"

Nous exécutons une requête de texte intégral pour rechercher le mot "Salut". Il ne fait pas partie de la liste de mots vides du système. Ainsi, la requête doit le retourner.

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

Le résultat est le suivant :

Nous avons obtenu tous les enregistrements contenant le mot "Salut". Cependant, nous aimerions l'exclure, car il s'agit d'un mot de bruit. Si nous utilisons la recherche en texte intégral dans notre analyse textuelle, ce mot peut nous détourner de l'objectif.

Cela nous amène à la troisième méthode :créer une liste de mots vides à partir d'une liste de mots vides personnalisée ou système.

Création d'une liste de mots vides personnalisée à partir de la liste de mots vides système

Créez une liste d'arrêt personnalisée appelée WatchMasterStoplist de la liste d'arrêt du système avec le script T-SQL suivant :

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

Associer une nouvelle liste de mots vides personnalisée à l'index de texte intégral

Associez la liste de mots vides personnalisée nouvellement créée à l'index de texte intégral comme suit :

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

Vérification de la liste d'arrêt personnalisée en recherchant le mot "ceci"

Vous pouvez vérifier rapidement si votre liste d'arrêt personnalisée comprend tous les mots parasites de la liste d'arrêt du système. Exécutez le même code que nous avons utilisé précédemment pour rechercher le mot "this".

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

Cette sortie doit être vide.

Ajout d'un nouveau mot de bruit "Salut" à la liste d'arrêt personnalisée

Nous devons ajouter le mot de bruit 'Salut' à la liste de mots vides personnalisée nouvellement créée. Exécutez le script suivant :

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

Le jeu de résultats est ci-dessous :

La vérification finale

Nous allons maintenant exécuter la vérification finale de la requête Full-Text pour certains mots parasites ; nous la comparons à l'ensemble de résultats d'origine contenant ces mots parasites.

Par exemple, si nous nous concentrons sur le quatrième avis (classé par ReviewId ), qui contient des mots parasites, puis comparez les résultats avec les résultats de la requête de texte intégral, nous ne devrions voir aucun mot parasite.

Exécutez le script suivant pour effectuer la vérification finale par rapport à l'exemple de base de données :

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

Le résultat est le suivant :

Requête en texte intégral pour rechercher les avis sur les montres numériques

Nous pouvons maintenant exécuter nos requêtes de recherche en texte intégral avec la liste de mots vides en place. Le script T-SQL suivant nous informera des avis sur les montres numériques (exemple) :

USE WatchReviewsMasterStoplist

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

Les résultats sont ci-dessous :

Toutes nos félicitations! Nous avons mis en œuvre avec succès les trois méthodes de création et d'association de listes de mots vides. Nous avons également examiné l'ajout de nouveaux mots aux listes de mots vides et la vérification des performances.

Pourtant, je recommande fortement la troisième méthode. Créez une liste de mots vides personnalisée à partir d'une liste de mots vides système, puis ajoutez des mots parasites pour améliorer votre recherche en texte intégral.

Choses à faire

Maintenant que vous connaissez bien les trois méthodes de création de listes de mots vides, vous pouvez faire quelques exercices pour améliorer vos compétences en analyse textuelle, comme les suivants :

  1. Ajoutez une liste de mots vides personnalisée à partir de la liste de mots vides du système par rapport à l'exemple de base de données, comme dans cet article.
  2. Créez une liste de mots vides personnalisée à partir de la liste de mots vides du système par rapport à l'exemple de base de données, comme dans cet article.
  3. Exécutez une requête T-SQL pour voir les mots vides ajoutés après vous être familiarisé avec cet article.