Olá amigos do Guia DBA, neste post vou falar de uma forma bem resumida até porque esse assunto é bem abrangente, sobre este recurso que é muito pouco usado, o Full Text Search.
– O que é o Full-Text Search?
O Full-Text Search é um recurso que permite que sejam feitas pesquisas de palavras em campos do tipo texto, XML ou binário, com flexibilizações semânticas. Imagine ter campos de texto livre em seu banco de dados, documentos do Word, PowerPoint ou outros formatos armazenados em colunas do tipo binary, varbinary ou image e ter a possibilidade de efetuar uma pesquisa indexada a estes campos, de forma muito simples, obtendo como resultado não apenas os registros que contenham a palavra pesquisada, mas também registros que contenham diferentes formas semânticas da mesma palavra, ou até mesmo outras palavras que estejam relacionadas aos termos pesquisados. Isso é o que o Full-Text Search nos proporciona.
CATALOGO -> Estrutura de armazenamento dos Índices
ÍNDICES FULL TEXT -> Permite Consultar Grandes volumes de dados não estruturados. Ex.: Filestream,XML,nVarchar(max) etc.
Estrutura da tabela usada:
— =============================================
— Criando Catalogo Full-text
— =============================================
/*
Um catálogo de texto completo é um objeto virtual e não pertence a nenhum grupo de arquivos. Um catálogo de texto completo é um conceito lógico que faz referência a um grupo de índices de texto completo.
*/
IF EXISTS (
SELECT *
FROM sys.fulltext_catalogs
WHERE name = N'CATALOGO'
)
DROP FULLTEXT CATALOG CATALOGO
GO
CREATE FULLTEXT CATALOG CATALOGO
WITH ACCENT_SENSITIVITY = OFF
GO
— =============================================
— Basic Create Full-text Index Template
— =============================================
IF EXISTS(
SELECT *
FROM sys.fulltext_indexes
JOIN sys.tables
ON sys.tables.object_id = sys.fulltext_indexes.object_id
WHERE sys.tables.name = 'Documento'
)
DROP FULLTEXT INDEX ON Documento
GO
CREATE FULLTEXT INDEX ON Documento (im_Doc TYPE COLUMN nm_Doc)
KEY INDEX PK_Documento
ON CATALOGO
WITH CHANGE_TRACKING = AUTO--, STOPLIST = SYSTEM
--WITH NO POPULATION
GO
Exemplo de uma consulta simples:
select nm_Doc from Documento where CONTAINS(im_Doc, 'Agravo')
select nm_Doc from Documento where FREETEXT(im_Doc, 'Agravo')
Todos os resultados listados possui alguma flexibilização da palavra “Agravo” no conteúdo do arquivo.
– CONTAINS pode pesquisar:
Uma palavra ou frase.
O prefixo de uma palavra ou frase.
Uma palavra próxima a outra.
Uma palavra gerada a partir de outra por flexão (por exemplo, a palavra guia é uma raiz flexional de guiar, guiou, guiando e guiado).
Uma palavra que é sinônima de outra usando um dicionário de sinônimos (por exemplo, a palavra “metal” pode ter sinônimos, como “alumínio” e “aço”).
Resumo:
CONTAINS É utilizado para buscar em colunas com dados tipo texto que tenham coincidências exatas ou aproximadas,
com palavras exatas ou com certa aproximação. Pode-se buscar uma palavra, uma frase, o prefixo de uma palavra ou uma frase,
uma palavra próxima de outra, etc.
CONTAINS = É um predicado que realiza a busca de um texto específico na coluna. O funcionamento desse recurso é similar ao predicado LIKE.
– FREETEXT pode pesquisar:
Separa a cadeia de caracteres em palavras individuais com base em limites de palavra (quebra de palavras).
Gera formas flexivas das palavras (ramificações).
Identifica uma lista de expansões ou substituições dos termos baseados em correspondências no dicionário de sinônimos.
Resumo:
FREETEXT É utilizado para buscar em colunas com dados tipo texto que coincidam com o significado e não literalmente com o conteúdo.
As consultas realizadas com FREETEXT têm menos precisão que as realizadas com CONTAINS.
FREETEXT = Neste predicado é analisado todas as palavras da frase e depois é devolvido os registros que contém a
frase ou algum fragmento do que foi especificado.
Em contraste com a pesquisa de texto completo, o LIKE funciona apenas em padrões de caracteres. Além disso, você não pode usar o predicado LIKE para consultar dados binários formatados. Além disso, uma consulta LIKE contra uma grande quantidade de dados de texto não estruturado é muito mais lento do que uma consulta de texto completo equivalente contra os mesmos dados. A consulta LIKE contra milhões de linhas de dados de texto podem tomar minutos para retornar, considerando que uma consulta de texto completo pode levar apenas alguns segundos ou menos contra os mesmos dados, dependendo do número de linhas que são retornadas.