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

Comment utiliser les mots vides et la liste de mots vides pour améliorer la recherche en texte intégral (FTS) de SQL Server

L'article actuel concerne l'utilisation des mots vides et des listes de mots vides. L'objectif est de rendre la recherche en texte intégral plus efficace en termes de stockage et de performances. De plus, les lecteurs de cet article recevront une présentation de la mise en œuvre de la recherche en texte intégral avec des mots vides et une liste de mots vides.

L'article souligne également l'importance des mots vides et des listes vides pour que la recherche de texte intégral reste précise et évite les mots inutiles.

Comprendre les mots vides et la liste de mots vides

Tout d'abord, clarifions l'essence de Stopwords et Stoplist. Ensuite, nous continuerons à les utiliser pour améliorer la recherche en texte intégral.

Une liste d'arrêt

Une liste de mots vides, comme son nom l'indique, est une liste de mots vides. Lorsqu'elle est associée à la recherche en texte intégral, la liste de mots vides peut filtrer les mots ou termes dépourvus de sens, améliorant ainsi les résultats de la recherche.

Un mot vide

Un mot vide est un mot qui joue un rôle mineur dans la recherche en texte intégral, bien qu'il soit important d'un point de vue grammatical. Par conséquent, un mot vide n'est pas essentiel du point de vue de la recherche en texte intégral.

Selon la documentation de Microsoft, un mot vide peut être un mot ayant une certaine signification dans une langue spécifique, ou il peut s'agir d'un jeton sans valeur linguistique. Dans les deux cas, il est inutile pour la Recherche Full-Text.

Exemples de mots vides

Voici les mots vides en anglais (britannique/américain) :

  • comme
  • à
  • être
  • parce que
  • il
  • a fait

Étant donné que les mots ci-dessus ne contribuent pas à la recherche en texte intégral, ce sont des mots vides, malgré leur importance pour la compréhension d'une phrase complète.

Liste(s) de mots vides du système

Chaque langue prise en charge, y compris l'anglais britannique, possède une liste de mots vides par défaut ou système qui peut être modifiée en fonction d'exigences particulières.

Liste(s) de mots vides personnalisés

Les utilisateurs peuvent créer leur propre liste d'arrêt/personnalisée, en utilisant la liste d'arrêt du système, ou à partir de zéro. Il est utile d'empêcher que des mots parasites ne fassent partie des résultats de recherche en texte intégral.

Langues et listes de mots vides

La recherche en texte intégral prend en charge de nombreuses langues différentes. Chacune des langues prises en charge possède au moins une liste de mots vides système par défaut. Cependant, il peut y avoir plusieurs listes de mots vides pour n'importe quelle langue, y compris les listes de mots vides système et personnalisées.

Liste des langues prises en charge

Nous pouvons rapidement consulter la liste de toutes les langues prises en charge utilisées avec la recherche en texte intégral. Pour cela, exécutez le script T-SQL suivant :

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

Les résultats sont les suivants :

La requête sur l'instance SQL Server 2016 renvoie un total de 53 langues.

Utilisation des mots vides et de la liste de mots vides avec la recherche en texte intégral

Maintenant, nous allons acquérir une expérience pratique de la création d'une liste de mots vides définie par l'utilisateur. Ensuite, nous l'utiliserons pour la recherche en texte intégral comme une procédure pas à pas. Ce sera comme un scénario en temps réel.

Prérequis

Tout d'abord, vous devez vous assurer que les conditions suivantes sont remplies pour implémenter correctement la procédure pas à pas :

  • Avoir une compréhension de base de la recherche en texte intégral
  • La possibilité d'implémenter la recherche en texte intégral dans SQL Server
  • La présence de l'option de recherche en texte intégral activée/installée sur l'instance SQL que vous prévoyez d'utiliser

Pour garantir ces prérequis, parcourez les articles ci-dessous si vous êtes déjà familiarisé avec les scripts T-SQL :

  • 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

Vérifier l'état de la recherche en texte intégral

Exécutez la requête suivante pour vérifier si la recherche en texte intégral est installée sur votre instance SQL :

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

Le résultat du script ci-dessus doit renvoyer 1 comme suit :

Si vous obtenez un nombre autre que 1, reportez-vous à nouveau aux articles mentionnés ci-dessus.

Configurer une base de données exemple (WatchReviewsStoplist)

Tout d'abord, vous devez configurer un exemple de base de données nommé WatchReviewsStoplist . Utilisez le script ci-dessous :

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

Vérifier l'exemple de base de données

Exécutez le script T-SQL suivant pour afficher le contenu de la table dans l'exemple de base de données :

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

Le résultat est le suivant :

Scénario de la liste d'arrêt

Supposons que nous ayons demandé à l'équipe de développement d'améliorer la recherche en texte intégral pour les avis des clients. Ils devraient le faire en excluant les mots parasites. De cette façon, la recherche en texte intégral reste efficace et ciblée.

Pour répondre à ces exigences, nous devons d'abord configurer la recherche en texte intégral. Cela signifie prendre les mesures suivantes :

  • Créer un catalogue de texte intégral
  • Créer une liste vide personnalisée ou définie par l'utilisateur
  • Créer un index de texte intégral

Créer un catalogue de texte intégral

Créez un catalogue de texte intégral avec le script suivant :

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

Créer une liste d'arrêt personnalisée vide

Créez une liste de mots vides personnalisée avec le script suivant :

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

Une liste de mots vides personnalisée est maintenant créée.

Créer un index de texte intégral

Enfin, créez un index de texte intégral dans la colonne Détails pour la langue anglaise britannique. Il pointera vers la liste de mots vides personnalisée créée précédemment. Utilisez le script T-SQL suivant pour cette action :

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

Requête en texte intégral pour obtenir une excellente note de la part des clients

Exécutez la requête en texte intégral suivante pour savoir quel produit (montre) a obtenu d'excellentes notes de la part des clients :

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

Les résultats sont ci-dessous :

Nous pouvons voir que les clients ont donné d'excellentes notes à la montre numérique noire. Par conséquent, nous connaissons le meilleur produit sur la base des avis et nous comprenons que la recherche en texte intégral fonctionne correctement.

Pourtant, il y a peu de problèmes que vous pourriez ignorer pour une table de cinq lignes, mais cela peut nous apporter des avantages en termes de performances et de stockage dans un ensemble de résultats relativement volumineux s'ils sont traités rapidement.

Recherchez le mot parasite "Salut" avec une requête en texte intégral

De nombreux mots parasites sont attachés à l'index de texte intégral. Bientôt, ils peuvent devenir un fardeau. De plus, ils ne sont d'aucune utilité pour la recherche.

Vérifions si le mot parasite Salut est présent dans les résultats de la recherche en texte intégral car il est préférable de l'exclure.

Exécutez la requête de texte intégral comme suit :

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

Les résultats sont ci-dessous :

Les résultats renvoyés montrent que le mot "Salut" fait partie des résultats de la recherche en texte intégral. Ainsi, nous devons l'exclure - cela n'a aucun sens pour la recherche et n'aide aucune analyse.

Modifier la liste de mots vides pour ajouter le mot vide haut

Nous ajouterons le mot vide Salut en modifiant notre liste de mots vides personnalisée afin qu'elle ne puisse pas être indexée par la recherche en texte intégral et ne soit pas renvoyée par les requêtes en texte intégral pour économiser de l'espace et améliorer la recherche :

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

Recherchez à nouveau le mot parasite "Salut" après l'avoir ajouté comme mot vide

Recherchez le mot bruyant Hi après l'avoir ajouté à la Stoplist :

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

Le résultat est le suivant :

Vérifier les mots vides ajoutés

À tout moment, vous pouvez vérifier les mots vides ajoutés à la Stoplist. Exécutez le script suivant pour cela :

-- Check added stopwords 
SELECT * FROM sys.fulltext_stopwords

Les résultats sont ci-dessous :

Toutes nos félicitations! Vous avez créé avec succès une liste de mots vides et y avez ajouté un mot vide. De cette façon, vous rendez la recherche de texte intégral plus efficace en termes de performances et de stockage.

Choses à faire

Maintenant que vous pouvez créer des listes de mots vides et y ajouter des mots vides, essayez ce qui suit pour améliorer encore vos compétences :

  • Ajoutez les mots "je", "ceci", "juste", "comme mots parasites à votre liste d'arrêt personnalisée créée dans cette procédure pas à pas.
  • Vérifiez les mots vides ajoutés en exécutant le script que nous avons spécifié à la fin de la procédure pas à pas.