sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo utilizar Stopwords y Stoplist para mejorar la búsqueda de texto completo (FTS) de SQL Server

El artículo actual trata sobre el uso de Stopwords y Stoplist. El objetivo es hacer que la búsqueda de texto completo sea más eficiente en términos de almacenamiento y rendimiento. Además, los lectores de este artículo obtendrán un tutorial sobre cómo implementar la búsqueda de texto completo con palabras vacías y lista de palabras vacías.

El artículo también destaca la importancia de las palabras vacías y las listas de palabras vacías para mantener la precisión de la búsqueda de texto completo y evitar palabras irrelevantes.

Comprensión de las palabras vacías y la lista de palabras vacías

Primero, aclaremos la esencia de Stopwords y Stoplist. Luego procederemos a usarlos para mejorar la búsqueda de texto completo.

Una lista de bloqueo

Una lista de palabras vacías, como su nombre lo indica, es una lista de palabras vacías. Cuando se asocia con la búsqueda de texto completo, la lista de palabras irrelevantes puede filtrar palabras o términos sin sentido, mejorando así los resultados de búsqueda.

Una palabra vacía

Una palabra vacía es una palabra que tiene un papel menor en la búsqueda de texto completo, a pesar de ser importante gramaticalmente. Por lo tanto, una palabra vacía no es esencial desde la perspectiva de la búsqueda de texto completo.

De acuerdo con la documentación de Microsoft, una palabra vacía puede ser una palabra con algún significado en un idioma específico, o puede ser un token sin valor lingüístico. En ambos casos, es inútil para la búsqueda de texto completo.

Ejemplos de palabras vacías

Las siguientes son palabras vacías en el idioma inglés (británico/estadounidense):

  • como
  • en
  • ser
  • porque
  • él
  • hizo

Dado que las palabras anteriores no contribuyen a la búsqueda de texto completo, son palabras vacías, a pesar de su importancia para comprender una oración completa.

Lista(s) de bloqueo del sistema

Cada idioma admitido, incluido el inglés británico, tiene una lista de palabras irrelevantes predeterminada o del sistema que se puede modificar según los requisitos particulares.

Listas de parada personalizadas

Los usuarios pueden crear su propia lista de palabras irrelevantes o personalizada, utilizando la lista de palabras irrelevantes del sistema o desde cero. Es útil para evitar que las palabras irrelevantes se conviertan en parte de los resultados de la búsqueda de texto completo.

Idiomas y listas de palabras irrelevantes

La búsqueda de texto completo admite muchos idiomas diferentes. Cada uno de los idiomas admitidos tiene al menos una lista de palabras irrelevantes del sistema de forma predeterminada. Sin embargo, puede haber varias listas de palabras irrelevantes para cualquier idioma, incluidas las listas de palabras irrelevantes personalizadas y del sistema.

Lista de idiomas admitidos

Podemos comprobar rápidamente la lista de todos los idiomas compatibles que se utilizan con la búsqueda de texto completo. Para ello, ejecute el siguiente script T-SQL:

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

Los resultados son los siguientes:

La consulta en la instancia de SQL Server 2016 devuelve un total de 53 idiomas.

Uso de palabras vacías y listas de palabras irrelevantes con búsqueda de texto completo

Ahora, obtendremos algo de experiencia práctica en la creación de una lista de palabras vacías definidas por el usuario. Luego, lo usaremos para la búsqueda de texto completo como guía. Será como un escenario en tiempo real.

Requisitos

En primer lugar, debe asegurarse de cumplir los siguientes requisitos para implementar el tutorial correctamente:

  • Tener un conocimiento básico de la búsqueda de texto completo
  • La capacidad de implementar la búsqueda de texto completo en SQL Server
  • La presencia de la opción de búsqueda de texto completo habilitada/instalada en la instancia de SQL que planea usar

Para garantizar esos requisitos previos, consulte los siguientes artículos si ya está familiarizado con las secuencias de comandos T-SQL:

  • Implementación de la búsqueda de texto completo en SQL Server 2016 para principiantes
  • Implementación de la búsqueda de texto completo en SQL Server 2016 para usuarios avanzados

Comprobar el estado de búsqueda de texto completo

Ejecute la siguiente consulta para verificar si tiene la búsqueda de texto completo instalada en su instancia de SQL:

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

El resultado de la secuencia de comandos anterior debería devolver 1 de la siguiente manera:

Si obtiene cualquier número que no sea 1, consulte los artículos mencionados anteriormente nuevamente.

Configurar base de datos de muestra (WatchReviewsStoplist)

Primero, debe configurar una base de datos de muestra llamada WatchReviewsStoplist . Utilice el siguiente script:

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

Comprobar base de datos de muestra

Ejecute el siguiente script T-SQL para ver el contenido de la tabla en la base de datos de ejemplo:

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

La salida es la siguiente:

Escenario de lista de bloqueo

Supongamos que le hemos pedido al equipo de desarrollo que mejore la búsqueda de texto completo para las reseñas de los clientes. Deberían hacerlo excluyendo las palabras irrelevantes. De esta manera, la búsqueda de texto completo sigue siendo eficiente y también enfocada.

Para cumplir con estos requisitos, primero debemos configurar la búsqueda de texto completo. Significa tomar las siguientes acciones:

  • Crear un catálogo de texto completo
  • Cree una lista vacía personalizada o definida por el usuario
  • Crear un índice de texto completo

Crear catálogo de texto completo

Cree un catálogo de texto completo con el siguiente script:

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

Cree una lista de parada personalizada vacía

Cree una lista de palabras irrelevantes personalizada en blanco con el siguiente script:

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

Ahora se crea una lista de parada personalizada.

Crear índice de texto completo

Finalmente, cree un Índice de texto completo en la columna Detalles para el idioma inglés británico. Apuntará a la lista de palabras irrelevantes personalizada creada anteriormente. Utilice el siguiente script T-SQL para esta acción:

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

Consulta de texto completo para que el cliente califique un reloj excelente

Ejecute la siguiente consulta de texto completo para averiguar qué producto (reloj) obtuvo excelentes calificaciones de los clientes:

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

Los resultados están a continuación:

Podemos ver que los clientes han dado excelentes calificaciones al reloj digital negro. Por lo tanto, conocemos el mejor producto según las reseñas y entendemos que la búsqueda de texto completo funciona bien.

Aún así, hay algunas preocupaciones que podría ignorar para una tabla de cinco filas, pero puede brindarnos beneficios de rendimiento y almacenamiento en un conjunto de resultados relativamente grande si se aborda de inmediato.

Buscar palabra irrelevante 'Hola' con consulta de texto completo

Hay muchas palabras irrelevantes adjuntas al índice de texto completo. Pronto, pueden convertirse en una carga. Además, no sirven para la búsqueda.

Veamos si la palabra irrelevante Hola está presente en los resultados de la búsqueda de texto completo porque es mejor excluirlo.

Ejecute la consulta de texto completo de la siguiente manera:

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

Los resultados están a continuación:

Los resultados devueltos muestran que la palabra "Hola" es parte de los resultados de búsqueda de texto completo. Por lo tanto, debemos excluirlo:no tiene sentido para la búsqueda y no ayuda a ningún análisis.

Modifique la lista de palabras irrelevantes para agregar palabras irrelevantes Hola

Agregaremos la palabra vacía Hola modificando nuestra Lista de parada personalizada para que no pueda ser indexada por la búsqueda de texto completo y no debería ser devuelta por las consultas de texto completo para ahorrar espacio y mejorar la búsqueda:

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

Vuelva a buscar la palabra irrelevante "Hola" después de agregarla como palabra vacía

Busque la palabra irrelevante Hola después de agregarla a la Lista de parada:

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

La salida es la siguiente:

Ver palabras vacías agregadas

En cualquier momento, puede verificar las palabras vacías agregadas a la Lista de palabras vacías. Ejecute el siguiente script para esto:

-- Check added stopwords 
SELECT * FROM sys.fulltext_stopwords

Los resultados están a continuación:

¡Felicidades! Ha creado correctamente una lista de palabras vacías y le ha agregado una palabra vacía. De esta manera, hace que la búsqueda de texto completo sea más eficiente tanto en rendimiento como en almacenamiento.

Cosas que hacer

Ahora que puede crear listas de palabras vacías y agregarles palabras vacías, intente lo siguiente para mejorar aún más sus habilidades:

  • Agregue las palabras 'yo', 'esto', 'solo', 'como palabras irrelevantes a su lista de palabras irrelevantes personalizada creada en este tutorial.
  • Compruebe las palabras vacías agregadas ejecutando el script que especificamos al final del tutorial.