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

Dominar el uso de listas de palabras irrelevantes con la búsqueda de texto completo (FTS) de SQL Server

La creación y administración de listas de palabras irrelevantes es uno de los principales componentes responsables de mejorar el rendimiento de la búsqueda de texto completo además de reducir el tamaño del índice. Este artículo tiene como objetivo ayudarlo a dominar el trabajo en profundidad e implementar múltiples estrategias para crear listas de parada en ejemplos simples pero interesantes.

También destacaremos la importancia de los diferentes métodos para generar listas de palabras irrelevantes y aclararemos cómo elegir el método más adecuado.

Por qué dominar las listas de palabras irrelevantes

Cuando hablamos sobre el uso de listas de palabras irrelevantes relacionadas con la búsqueda de texto completo, la primera pregunta es por qué aprendemos tanto sobre estas listas de palabras irrelevantes. La respuesta se encuentra en los beneficios evidentes y ocultos del uso de listas de palabras irrelevantes con la búsqueda de texto completo. También hay ganancias a largo plazo que pueden traer una vez que se implementen con éxito.

Importancia de las listas de parada

Una lista de palabras vacías es un componente específico del idioma de la búsqueda de texto completo que contiene palabras vacías definidas por el usuario o proporcionadas por el sistema. Tiene que excluir tales palabras para que no se conviertan en parte de la búsqueda de texto completo.

Un diseño de búsqueda de texto completo sin una lista de palabras irrelevantes no es el uso óptimo de los componentes específicos del idioma que deberían mejorar la eficiencia y el tiempo de respuesta de la búsqueda de texto completo.

Requisitos

  1. Puede escribir y ejecutar secuencias de comandos T-SQL.
  2. La búsqueda de texto completo debe estar instalada en su instancia de SQL Server.
  3. Está familiarizado con los conceptos básicos y la implementación de la búsqueda de texto completo.
  4. Tiene conocimientos básicos de palabras vacías y listas vacías.

En caso de que no tenga la información para garantizar los requisitos anteriores, consulte los siguientes artículos:

  • 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
  • Cómo usar Stopwords y Stoplist para mejorar la búsqueda de texto completo (FTS) de SQL Server

Estrategias Múltiples de la Creación de Stoplist

Hay muchos métodos o estrategias diferentes, pero algunos de ellos son mucho mejores que otros. Cualquier desarrollador de base de datos con habilidades de implementación de búsqueda de texto completo debe estar familiarizado con todos los métodos para elegir el mejor cuando sea necesario.

La forma más efectiva de comprender estas diferentes estrategias es aplicarlas en una base de datos de muestra.

Configurar base de datos de muestra

El primer paso es configurar la base de datos para ejecutar consultas de texto completo. Cree una base de datos de muestra llamada 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

Resumen de estrategias de múltiples listas de parada

Puede usar las siguientes tres formas/estrategias para crear una lista de palabras irrelevantes y evitar que las palabras irrelevantes se conviertan en parte de sus consultas de búsqueda de texto completo:

  1. Cree una lista de palabras irrelevantes personalizada
  2. Crear una lista de palabras irrelevantes del sistema
  3. Cree una lista de palabras irrelevantes a partir de una lista de palabras irrelevantes personalizada (o del sistema)

Requisitos previos de la lista de bloqueo

Recuerde que antes de crear una lista de palabras irrelevantes, debe hacer lo siguiente:

  1. Cree un índice único en una de las columnas de la tabla si no hay una columna clave disponible (Clave principal).
  2. Cree un catálogo de texto completo.
  3. Cree un índice de texto completo.

Cree una lista de parada personalizada

Suponga que hay disponible un índice único o una columna de clave principal (como en nuestra base de datos de ejemplo). Creamos una lista de parada personalizada de la siguiente manera:

  1. Cree un catálogo de texto completo.
  2. Cree una lista de parada personalizada vacía.
  3. Cree un índice de texto completo con la lista de palabras irrelevantes personalizada creada en el paso 2.

Para obtener información detallada, consulte el artículo Cómo usar palabras vacías y listas de palabras vacías para mejorar la búsqueda de texto completo (FTS) de SQL Server

Ventajas y desventajas de las listas de parada personalizadas

La mayor ventaja de crear una lista de palabras irrelevantes personalizada es que puede tener control total sobre ella y realizar un seguimiento agregando y eliminando palabras que cree que son irrelevantes.

Sin embargo, hay una desventaja en el uso de este enfoque. La lista de palabras vacías es muy limitada y no incluirá las palabras vacías recomendadas por el sistema para mejorar aún más el rendimiento de las consultas de texto completo.

Creación de una lista de bloqueo del sistema

Cree una lista de palabras irrelevantes del sistema (si se proporciona la columna de clave principal o el índice único) de la siguiente manera:

  1. Cree un catálogo de texto completo.
  2. Cree un índice de texto completo con la lista de palabras irrelevantes del sistema.

Nos preparamos para usar la lista de palabras irrelevantes del sistema creando primero un catálogo de texto completo:

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

Cree un índice de texto completo en la columna de reseñas (Detalles) de la tabla WatchReview con la lista de bloqueo del sistema. Utilice el siguiente 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  

Ver la lista de bloqueo del sistema de idioma inglés

Puede ver la lista de palabras vacías incluidas en la lista de palabras vacías del sistema de inglés británico. Ejecute la siguiente consulta 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'

La salida es la siguiente:

Ver las 3 reseñas más recientes

Ejecute una comprobación rápida con la base de datos de muestra recién creada. Hágalo obteniendo las 3 reseñas de relojes más recientes de WatchReview tabla:

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

La salida es la siguiente:

Comprobación de palabras vacías ejecutando consultas de texto completo

Podemos ejecutar consultas de texto completo en la tabla nominada. No se sorprenda si muchas palabras irrelevantes (incluidas en la lista de palabras irrelevantes del sistema para mejorar el rendimiento) no aparecen en las consultas de texto completo. Significa que nuestra lista de bloqueo del sistema está haciendo su trabajo correctamente.

Como podemos ver, la palabra ‘esto’ está presente en las 3 mejores reseñas. Sin embargo, es una palabra irrelevante reconocida por la lista de palabras irrelevantes del sistema.

Verifiquemos si una búsqueda de texto completo devuelve la palabra irrelevante 'esto' incluido en la lista de bloqueo del sistema:

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

El conjunto de resultados está a continuación:

Ahora podemos ejecutar la consulta de texto completo para buscar la palabra 'es' que es otra palabra irrelevante:

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

El resultado de la consulta es el siguiente:

Podemos ver que la palabra 'es' también se ha evitado con éxito que se convierta en parte del resultado de la consulta de texto completo al ahorrar recursos valiosos.

Consulta de texto completo para buscar la palabra "Hola"

Ejecutamos una consulta de texto completo para buscar la palabra "Hola". No es parte de la lista de bloqueo del sistema. Por lo tanto, la consulta debe devolverlo.

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

La salida es la siguiente:

Obtuvimos todos los registros que contenían la palabra "Hola". Sin embargo, nos gustaría excluirlo, ya que es una palabra irrelevante. Si usamos búsqueda de texto completo en nuestro análisis textual, esta palabra puede distraernos del objetivo.

Esto nos lleva al tercer método:crear una lista de palabras irrelevantes a partir de una lista de palabras irrelevantes personalizada o del sistema.

Creación de una lista de palabras irrelevantes personalizada a partir de la lista de palabras irrelevantes del sistema

Cree una lista de parada personalizada llamada WatchMasterStoplist de la lista de palabras irrelevantes del sistema con el siguiente script T-SQL:

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

Asociación de una nueva lista de palabras irrelevantes personalizada con índice de texto completo

Asocie la lista de palabras irrelevantes personalizada recién creada con el índice de texto completo de la siguiente manera:

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

Comprobación de la lista de parada personalizada mediante la búsqueda de la palabra "esto"

Puede verificar rápidamente si su lista de palabras irrelevantes personalizada incluye todas las palabras irrelevantes de la lista de palabras irrelevantes del sistema. Ejecute el mismo código que usamos anteriormente para buscar la palabra 'esto'.

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

Esta salida debe estar en blanco.

Agregar una nueva palabra irrelevante "Hola" a la Lista de palabras irrelevantes personalizada

Necesitamos agregar la palabra irrelevante 'Hola' a la lista de palabras irrelevantes personalizada recién creada. Ejecute el siguiente script:

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

El conjunto de resultados está a continuación:

La comprobación final

Ahora ejecutaremos la verificación de consulta de texto completo final para algunas palabras irrelevantes:lo compararemos con el conjunto de resultados original que contiene esas palabras irrelevantes.

Por ejemplo, si nos centramos en la cuarta revisión (ordenada por ReviewId ), que contiene algunas palabras irrelevantes, y luego compare los resultados con los resultados de la consulta de texto completo, no deberíamos ver palabras irrelevantes.

Ejecute el siguiente script para realizar la verificación final con la base de datos de ejemplo:

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

La salida es la siguiente:

Consulta de texto completo para buscar reseñas de relojes digitales

Ahora podemos ejecutar nuestras consultas de búsqueda de texto completo con la lista de palabras irrelevantes en su lugar. El siguiente script T-SQL nos informará sobre las revisiones de relojes digitales (muestra):

USE WatchReviewsMasterStoplist

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

Los resultados están a continuación:

¡Felicidades! Hemos implementado con éxito los tres métodos para crear y asociar listas de palabras irrelevantes. También examinamos la adición de nuevas palabras a las listas de palabras irrelevantes y la verificación del rendimiento.

Aún así, recomiendo encarecidamente el tercer método. Cree una lista de palabras irrelevantes personalizada a partir de una lista de palabras irrelevantes del sistema y luego agregue palabras irrelevantes para mejorar su búsqueda de texto completo.

Cosas que hacer

Ahora que conoce bien los tres métodos para crear listas de palabras irrelevantes, puede hacer algunos ejercicios para mejorar sus habilidades de análisis textual, como los siguientes:

  1. Agregue una lista de palabras irrelevantes personalizada de la lista de palabras irrelevantes del sistema contra la base de datos de muestra, como en este artículo.
  2. Cree una lista de palabras irrelevantes personalizada a partir de la lista de palabras irrelevantes del sistema contra la base de datos de muestra, como en este artículo.
  3. Ejecute una consulta T-SQL para ver las palabras vacías agregadas después de familiarizarse con este artículo.