Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Dominando o uso de listas de palavras irrelevantes com a pesquisa de texto completo (FTS) do SQL Server


Criar e gerenciar listas de palavras irrelevantes serve como um dos principais componentes responsáveis ​​por melhorar o desempenho da Pesquisa de Texto Completo, além de reduzir o tamanho do índice. Este artigo tem como objetivo ajudá-lo a dominar o trabalho em profundidade e implementar várias estratégias para criar listas de palavras irrelevantes em exemplos simples, mas interessantes.

Também destacaremos a importância de diferentes métodos para gerar listas de palavras irrelevantes e esclarecer como escolher o método mais adequado.

Por que dominar listas de paradas


Quando falamos sobre o uso de listas de palavras irrelevantes relacionadas à Pesquisa de Texto Completo, a primeira pergunta é por que aprendemos tanto sobre essas listas de palavras irrelevantes. A resposta está nos benefícios evidentes e ocultos do uso de listas de palavras irrelevantes com a pesquisa de texto completo. Há também ganhos de longo prazo que eles podem trazer uma vez implementados com sucesso.

Importância das listas de paradas


Uma lista de palavras irrelevantes é um componente específico do idioma da Pesquisa de texto completo que contém palavras irrelevantes definidas pelo usuário ou fornecidas pelo sistema. Ele deve excluir essas palavras de se tornarem parte da Pesquisa de Texto Completo.

Um design de pesquisa de texto completo sem uma lista de palavras irrelevantes não é o uso ideal de componentes específicos de idioma que devem melhorar a eficiência e o tempo de resposta da pesquisa de texto completo.

Pré-requisitos

  1. Você pode escrever e executar scripts T-SQL.
  2. A pesquisa de texto completo deve ser instalada em sua instância do SQL Server.
  3. Você está familiarizado com os conceitos básicos e a implementação da pesquisa de texto completo.
  4. Você tem conhecimento básico de palavras irrelevantes e listas irrelevantes.

Caso você não tenha as informações para garantir os requisitos acima, consulte os artigos abaixo:
  • Implementando a pesquisa de texto completo no SQL Server 2016 para iniciantes
  • Implementando a pesquisa de texto completo no SQL Server 2016 para usuários avançados
  • Como usar Stopwords e Stoplist para melhorar a pesquisa de texto completo (FTS) do SQL Server

Várias estratégias de criação de listas de parada


Existem muitos métodos ou estratégias diferentes, mas alguns deles são muito melhores do que outros. Qualquer desenvolvedor de banco de dados com habilidades de implementação de pesquisa de texto completo deve estar familiarizado com todos os métodos para escolher o melhor quando necessário.

A maneira mais eficaz de entender essas diferentes estratégias é aplicá-las em um banco de dados de amostra.

Configurar banco de dados de amostra


A primeira etapa é configurar o banco de dados para executar consultas de texto completo. Crie um banco de dados de exemplo chamado 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

Visão geral das estratégias de várias listas de parada


Você pode usar as três maneiras/estratégias a seguir para criar uma lista de palavras irrelevantes e evitar que palavras inúteis se tornem parte de suas consultas de pesquisa de texto completo:
  1. Criar uma lista de palavras irrelevantes personalizada
  2. Criar uma lista de palavras irrelevantes do sistema
  3. Criar uma lista de palavras irrelevantes a partir de uma lista de palavras irrelevantes personalizada (ou do sistema)

Pré-requisitos da lista de parada


Lembre-se de que antes de criar uma lista de palavras irrelevantes, você deve fazer o seguinte:
  1. Crie um índice exclusivo em uma das colunas da tabela se não houver nenhuma coluna de chave disponível (chave primária).
  2. Crie um catálogo de texto completo.
  3. Crie um índice de texto completo.

Criar uma lista de parada personalizada


Suponha que um índice exclusivo ou coluna de chave primária esteja disponível (como em nosso banco de dados de exemplo). Criamos uma lista de palavras irrelevantes personalizada da seguinte forma:
  1. Crie um catálogo de texto completo.
  2. Crie uma lista de palavras irrelevantes personalizada vazia.
  3. Crie um índice de texto completo com a lista de palavras irrelevantes personalizada criada na etapa 2.

Para obter informações detalhadas, consulte o artigo Como usar palavras de interrupção e lista de interrupção para melhorar a pesquisa de texto completo (FTS) do SQL Server

Prós e contras das listas de palavras irrelevantes personalizadas


A maior vantagem de criar uma lista de palavras irrelevantes personalizada é que você pode ter controle total sobre ela e acompanhá-la adicionando e removendo palavras que você acha que são palavras de ruído.

Há uma desvantagem em usar essa abordagem, no entanto. A lista de palavras irrelevantes é muito limitada e não incluirá as palavras irrelevantes recomendadas pelo sistema para melhorar ainda mais o desempenho das consultas de texto completo.

Criando uma lista de parada do sistema


Crie uma lista de palavras irrelevantes do sistema (se a coluna de chave primária ou o índice exclusivo for fornecido) da seguinte maneira:
  1. Crie um catálogo de texto completo.
  2. Crie um índice de texto completo com a lista de palavras irrelevantes do sistema.

Preparamos para usar a lista de palavras irrelevantes do sistema criando primeiro um Catálogo de Texto Completo:
-- Create Full-Text catalog
CREATE FULLTEXT CATALOG [WatchReviewCatalog] AS DEFAULT;
GO

Crie um índice de texto completo na coluna de comentários (Detalhes) da tabela WatchReview com a lista de palavras irrelevantes do sistema. Use o seguinte 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  

Visualizar a lista de parada do sistema de idioma inglês


Você pode visualizar a lista de palavras irrelevantes incluídas na lista de palavras irrelevantes do sistema do inglês britânico. Execute a seguinte 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'

A saída é a seguinte:

Veja as 3 principais avaliações mais recentes


Execute uma verificação rápida no banco de dados de amostra recém-criado. Faça isso obtendo as três principais análises de relógios mais recentes do WatchReview tabela:
-- 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

A saída é a seguinte:

Verificando palavras irrelevantes executando consultas de texto completo


Podemos executar consultas de texto completo na tabela indicada. Não se surpreenda se muitas palavras de ruído (incluídas na lista de palavras irrelevantes do sistema para melhorar o desempenho) não aparecerem nas consultas de texto completo. Isso significa que nossa lista de palavras irrelevantes do sistema está fazendo seu trabalho corretamente.

Como podemos ver, a palavra 'isto' está presente nas 3 melhores avaliações. No entanto, é uma palavra de ruído em si reconhecida pela lista de palavras irrelevantes do sistema.

Vamos verificar se uma pesquisa de texto completo retorna a palavra de ruído 'this' incluídos na lista de palavras irrelevantes do sistema:
--Run Full-Text query to Search for Noise word 'this' 
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'this')

O conjunto de resultados está abaixo:

Agora podemos executar a consulta de texto completo para pesquisar a palavra 'é' que é outra palavra de ruído:
--Run Full-Text query to Search for Noise word 'is' 
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'is')

A saída da consulta está abaixo:

Podemos ver que a palavra 'é' também foi impedido com sucesso de se tornar parte do resultado da consulta de texto completo, economizando recursos valiosos.

Consulta de texto completo para pesquisar a palavra "Oi"


Executamos uma consulta de texto completo para pesquisar a palavra 'Oi' Não faz parte da lista de palavras irrelevantes do sistema. Assim, a consulta deve devolvê-lo.
--Search Noise word 'Hi' 
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'Hi')

A saída é a seguinte:

Temos todos os registros contendo a palavra 'Oi' No entanto, gostaríamos de excluí-lo, pois é uma palavra de ruído. Se usarmos a Pesquisa de Texto Completo em nossa análise textual, essa palavra pode nos distrair do objetivo.

Isso nos leva ao terceiro método:criar uma lista de palavras irrelevantes a partir de uma lista de palavras irrelevantes personalizada ou do sistema.

Criando uma lista de parada personalizada a partir da lista de parada do sistema


Crie uma lista de palavras irrelevantes personalizada chamada WatchMasterStoplist da lista de palavras irrelevantes do sistema com o seguinte script T-SQL:
--Creating a custom stoplist WatchMasterStoplist from system stoplist 
CREATE FULLTEXT STOPLIST [WatchMasterStoplist] FROM SYSTEM STOPLIST;
GO

Associando uma nova lista de palavras irrelevantes personalizada com índice de texto completo


Associe a lista de palavras irrelevantes recém-criada ao índice de texto completo da seguinte maneira:
USE [WatchReviewsMasterStoplist]
GO
-- Associating new custom stoplist with Full-Text index
ALTER FULLTEXT INDEX ON [dbo].[WatchReview] SET STOPLIST = [WatchMasterStoplist]

Verificando a lista de palavras irrelevantes personalizada pesquisando a palavra 'this'


Você pode verificar rapidamente se sua lista de palavras irrelevantes personalizada inclui todas as palavras de ruído da lista de palavras irrelevantes do sistema. Execute o mesmo código que usamos anteriormente para pesquisar a palavra "isto".
--Run Full-Text query to Search for Noise word 'this' 
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'this')

Esta saída deve estar em branco.

Adicionando uma nova palavra de ruído 'Hi' à lista de parada personalizada


Precisamos adicionar a palavra de ruído 'Oi' para a lista de palavras irrelevantes personalizada recém-criada. Execute o seguinte script:
--Alter customer stoplist to add Hi noise word
ALTER FULLTEXT STOPLIST WatchMasterStoplist
ADD 'Hi' LANGUAGE 'British English';  

O conjunto de resultados está abaixo:

A Verificação Final


Agora, executaremos a verificação final da consulta de Texto Completo para algumas palavras de ruído – comparamos com o conjunto de resultados original que contém essas palavras de ruído.

Por exemplo, se nos concentrarmos na quarta avaliação (ordenada por ReviewId ), que contém algumas palavras de ruído e, em seguida, compare os resultados com os resultados da consulta de texto completo, não devemos ver palavras de ruído.

Execute o script a seguir para realizar a verificação final no banco de dados de amostra:
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

A saída é a seguinte:

Consulta de texto completo para pesquisar as avaliações de relógios digitais


Agora podemos executar nossas consultas de pesquisa de texto completo com a lista de palavras irrelevantes. O script T-SQL a seguir nos informará sobre as análises de relógios digitais (amostra):
USE WatchReviewsMasterStoplist

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

Os resultados estão abaixo:

Parabéns! Implementamos com sucesso todos os três métodos de criação e associação de listas de palavras irrelevantes. Também examinamos a adição de novas palavras às listas de palavras irrelevantes e a verificação do desempenho.

Ainda assim, eu recomendo fortemente o terceiro método. Crie uma lista de palavras irrelevantes personalizada a partir de uma lista de palavras irrelevantes do sistema e adicione palavras de ruído para melhorar sua pesquisa de texto completo.

Coisas para fazer


Agora que você conhece bem os três métodos de criação de listas de palavras irrelevantes, você pode fazer alguns exercícios para melhorar suas habilidades de análise de texto, como o seguinte:
  1. Adicione uma lista de palavras irrelevantes personalizada da lista de palavras irrelevantes do sistema no banco de dados de amostra, como neste artigo.
  2. Crie uma lista de palavras irrelevantes personalizada a partir da lista de palavras irrelevantes do sistema em relação ao banco de dados de amostra, como neste artigo.
  3. Execute uma consulta T-SQL para ver as palavras irrelevantes adicionadas depois de se familiarizar com este artigo.