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

Como usar Stopwords e Stoplist para melhorar a Pesquisa de Texto Completo (FTS) do SQL Server


O artigo atual é sobre o uso de Stopwords e Stoplist. O objetivo é tornar a pesquisa de texto completo mais eficiente em termos de armazenamento e desempenho. Além disso, os leitores deste artigo terão um passo a passo da implementação da pesquisa de texto completo com palavras irrelevantes e lista de palavras irrelevantes.

O artigo também destaca a importância de Stopwords e Stoplist(s) para manter a pesquisa de texto completo precisa e evitar palavras de ruído.

Compreendendo Stopwords e Stoplist


Primeiro, vamos esclarecer a essência de Stopwords e Stoplist. Em seguida, continuaremos a usá-los para melhorar a pesquisa de texto completo.

Uma lista de parada


Uma lista de palavras irrelevantes, como o nome indica, é uma lista de palavras irrelevantes. Quando associada à pesquisa de texto completo, a Stoplist pode filtrar palavras ou termos sem sentido, melhorando assim os resultados da pesquisa.

Uma Stopword


Uma stopword é uma palavra que tem um papel menor na Pesquisa de Texto Completo, apesar de ser gramaticalmente importante. Portanto, uma palavra irrelevante não é essencial na perspectiva da Pesquisa de Texto Completo.

De acordo com a documentação da Microsoft, uma palavra irrelevante pode ser uma palavra com algum significado em um idioma específico ou pode ser algum token sem valor linguístico. Em ambos os casos, é inútil para a Pesquisa de Texto Completo.

Exemplos de palavras irrelevantes


A seguir, são palavras irrelevantes no idioma inglês (britânico/americano):
  • como
  • em
  • ser
  • porque
  • ele
  • fez

Como as palavras acima não contribuem para a pesquisa de texto completo, elas são palavras irrelevantes, apesar de sua importância na compreensão de uma frase completa.

Lista(s) de paradas do sistema


Cada idioma suportado, incluindo o inglês britânico, possui uma lista de palavras irrelevantes padrão ou do sistema que pode ser modificada de acordo com requisitos específicos.

Listas de paradas personalizadas


Os usuários podem criar sua própria lista de palavras irrelevantes/personalizada, usando a lista de palavras irrelevantes do sistema ou do zero. É útil evitar que palavras de ruído se tornem parte dos resultados da Pesquisa de Texto Completo.

Idiomas e listas de paradas


A pesquisa de texto completo suporta muitos idiomas diferentes. Cada um dos idiomas suportados tem pelo menos uma lista de palavras irrelevantes do sistema por padrão. No entanto, pode haver várias listas de palavras irrelevantes para qualquer idioma, incluindo listas de palavras irrelevantes do sistema e personalizadas.

Lista de idiomas suportados


Podemos verificar rapidamente a lista de todos os idiomas suportados usados ​​com a pesquisa de texto completo. Para isso, execute o seguinte script T-SQL:
-- List of Full-Text Search supported languages
SELECT ftl.lcid,ftl.name FROM sys.fulltext_languages ftl

Os resultados são os seguintes:

A consulta na instância do SQL Server 2016 retorna um total de 53 idiomas.

Usando palavras irrelevantes e lista de palavras irrelevantes com pesquisa de texto completo


Agora, teremos uma experiência prática de criar uma lista de palavras irrelevantes definida pelo usuário. Em seguida, vamos usá-lo para a pesquisa de texto completo como um passo a passo. Será como um cenário em tempo real.

Pré-requisitos


Antes de tudo, você precisa garantir os seguintes requisitos para implementar o passo a passo corretamente:
  • Ter uma compreensão básica da pesquisa de texto completo
  • A capacidade de implementar a pesquisa de texto completo no SQL Server
  • A presença da opção Full-Text Search habilitada/instalada na instância SQL que você planeja usar

Para garantir esses pré-requisitos, consulte os artigos abaixo se você já estiver familiarizado com o script T-SQL:
  • 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

Verifique o status da pesquisa de texto completo


Execute a seguinte consulta para verificar se você tem a pesquisa de texto completo instalada em sua instância SQL:
-- Is Full-Text Search installed then 1 or 0
SELECT fulltextserviceproperty('IsFulltextInstalled') as [Full-Text Search]

O resultado do script acima deve retornar 1 da seguinte forma:

Se você obtiver qualquer número diferente de 1, consulte os artigos mencionados acima novamente.

Configurar banco de dados de amostra (WatchReviewsStoplist)


Primeiro, você precisa configurar um banco de dados de exemplo chamado WatchReviewsStoplist . Use o script abaixo:
-- 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

Verificar banco de dados de amostra


Execute o seguinte script T-SQL para exibir o conteúdo da tabela no banco de dados de exemplo:
-- Check sample database
SELECT wr.ReviewId,wr.Person,wr.Details FROM dbo.WatchReview wr

A saída é a seguinte:

Cenário de lista de parada


Suponha que pedimos à equipe de desenvolvimento para melhorar a pesquisa de texto completo para as avaliações dos clientes. Eles devem fazê-lo excluindo palavras de ruído. Dessa forma, a Pesquisa de Texto Completo permanece eficiente e também focada.

Para atender a esses requisitos, precisamos primeiro configurar a pesquisa de texto completo. Significa tomar as seguintes ações:
  • Criar um catálogo de texto completo
  • Criar uma lista de parada personalizada ou definida pelo usuário vazia
  • Criar um índice de texto completo

Criar Catálogo de Texto Completo


Crie um catálogo de texto completo com o seguinte script:
-- Create Full-Text catalog
CREATE FULLTEXT CATALOG [WatchReviewCatalog] AS DEFAULT;
GO

Criar uma lista de parada personalizada vazia


Crie uma lista de palavras irrelevantes personalizada em branco com o seguinte script:
-- Create empty custom stoplist
CREATE FULLTEXT STOPLIST [WatchReviewStoplist];
GO  

Uma lista de palavras irrelevantes personalizada agora é criada.

Criar índice de texto completo


Por fim, crie um Índice de Texto Completo na coluna Detalhes para o idioma inglês britânico. Ele apontará para a lista de palavras irrelevantes personalizada criada anteriormente. Use o seguinte script T-SQL para esta ação:
-- 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 obter um relógio excelente classificado pelo cliente


Execute a seguinte consulta de texto completo para descobrir qual produto (relógio) obteve excelentes notas pelos clientes:
--Search customer reviews where the product was rated excellent
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'excellent') 

Os resultados estão abaixo:

Podemos ver que os clientes deram excelentes classificações ao relógio digital preto. Portanto, conhecemos o melhor produto com base em avaliações e entendemos que a pesquisa de texto completo funciona bem.

Ainda assim, há poucas preocupações que você pode ignorar para uma tabela de cinco linhas, mas isso pode nos trazer benefícios de desempenho e armazenamento em um conjunto de resultados relativamente grande se for resolvido imediatamente.

Pesquisar palavra de ruído "Oi" com consulta de texto completo


Há muitas palavras de ruído anexadas ao índice de texto completo. Em breve, eles podem se tornar um fardo. Além disso, eles não são úteis para a pesquisa.

Vamos verificar se a palavra de ruído Oi está presente nos resultados da pesquisa de texto completo porque é melhor excluí-lo.

Execute a consulta de texto completo da seguinte maneira:
--Run Full-Text query to Search for Noise word 'Hi'
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'Hi')

Os resultados estão abaixo:

Os resultados retornados mostram que a palavra “Oi” faz parte dos resultados da pesquisa de Texto Completo. Assim, precisamos excluí-lo – não tem sentido para a pesquisa e não ajuda em nenhuma análise.

Alterar lista de parada para adicionar palavra de parada Hi


Adicionaremos a palavra irrelevante Oi alterando nossa Stoplist personalizada para que ela não possa ser indexada pela pesquisa de Texto Completo e não deva ser retornada por consultas de Texto Completo para economizar espaço e melhorar a pesquisa:
--Alter customer stoplist to add Hi noise word
ALTER FULLTEXT STOPLIST WatchReviewStoplist
ADD 'Hi' LANGUAGE 'British English';  

Pesquise a palavra de ruído 'Hi' novamente após adicioná-la como Stopword


Procure a palavra de ruído Hi depois de adicioná-la à Stoplist:
--Search Noise word 'Hi' after it has been added as a stopword
SELECT * FROM dbo.WatchReview
WHERE CONTAINS(Details,'Hi')

A saída é a seguinte:

Verifique as palavras irrelevantes adicionadas


A qualquer momento, você pode verificar as palavras irrelevantes adicionadas à lista de palavras irrelevantes. Execute o seguinte script para isso:
-- Check added stopwords 
SELECT * FROM sys.fulltext_stopwords

Os resultados estão abaixo:

Parabéns! Você criou com sucesso uma lista de palavras irrelevantes e adicionou uma palavra irrelevante a ela. Dessa forma, você torna a pesquisa de texto completo mais eficiente em desempenho e armazenamento.

Coisas para fazer


Agora que você pode criar listas de palavras irrelevantes e adicionar palavras irrelevantes a elas, tente o seguinte para melhorar ainda mais suas habilidades:
  • Adicione palavras 'eu', 'este', 'apenas', 'como palavras de ruído à sua lista de palavras irrelevantes personalizada criada neste passo a passo.
  • Verifique as palavras irrelevantes adicionadas executando o script que especificamos no final do passo a passo.