Compartilhar via


Criar e gerenciar índices de texto completo

As informações contidas em índices de texto completo são usadas pelo Mecanismo de Texto Completo para compilar consultas de texto completo que podem procurar determinadas palavras ou combinações de palavras rapidamente em uma tabela. Um índice de texto completo armazena informações sobre palavras importantes e sua localização em uma ou mais colunas de uma tabela de banco de dados. Um índice de texto completo consiste em um tipo especial de índice funcional com base em token que é criado e mantido pelo Mecanismo de Texto Completo do SQL Server. O processo de criação de um índice de texto completo é diferente da criação de outros tipos de índices. Em vez de criar uma estrutura de árvore B com base em um valor armazenado em uma linha específica, o Mecanismo de Texto Completo cria uma estrutura de índice compactada, empilhada e invertida com base em tokens individuais do texto que está sendo indexado. O tamanho de um índice de texto completo é limitado apenas pelos recursos de memória disponíveis do computador no qual a instância do SQL Server está sendo executada.

A partir do SQL Server 2008, os índices de texto completo são integrados ao Mecanismo de Banco de Dados e deixam de residir no sistema de arquivos, como ocorria nas versões anteriores do SQL Server. Em um novo banco de dados, agora o catálogo de texto completo é um objeto virtual que não pertence a nenhum grupo de arquivos; ele é simplesmente um conceito lógico que faz referência a um grupo dos índices de texto completo. Observe, no entanto, que durante a atualização de um banco de dados SQL Server 2005, qualquer catálogo de texto completo que contenha arquivos de dados, um novo grupo de arquivos é criado; para obter mais informações, consulte Atualizar Full-Text Pesquisa.

Observação

No SQL Server 2008 e em versões posteriores, o Mecanismo de Texto Completo reside no processo do SQL Server e não em um serviço separado. A integração do Mecanismo de Texto Completo ao Mecanismo de Banco de Dados melhora a capacidade de gerenciamento de texto completo, a otimização de consultas mistas e o desempenho como um todo.

Só é permitido um índice de texto completo por tabela. Para que um índice de texto completo seja criado em uma tabela, a tabela deve ter uma única coluna não nula exclusiva. Você pode criar um índice de texto completo em colunas do tipo char, varchar, nchar, nvarchar, text, ntext, image, xml, varbinary e varbinary(max), que podem ser indexadas para pesquisa de texto completo. Criar um índice de texto completo em uma coluna cujo tipo de dados é varbinary, varbinary(max), imageou xml requer que você especifique uma coluna de tipo. Uma coluna de tipo consiste em uma coluna de tabela em que você armazena a extensão de arquivo (.doc, .pdf, .xls, etc.) do documento em cada linha.

O processo de criar e manter um índice de texto completo é chamado de população (também conhecido como rastreamento). Existem três tipos de população de índice de texto completo: população completa, população com base em controle de alterações e população incremental com base em carimbo de data e hora. Para obter mais informações, veja Popular índices de texto completo.

Tarefas comuns

Para criar um índice de texto completo

Para alterar um índice de texto completo

Para descartar um índice de texto completo

Neste tópico

Estrutura de índice de texto completo

Um bom conhecimento da estrutura do índice de texto completo ajudará você a entender como funciona o Mecanismo de Texto Completo. Este tópico usa o trecho a seguir da tabela Document em Adventure Works como tabela de exemplo. Esse trecho mostra apenas duas colunas, DocumentID e Title , e três linhas da tabela.

Para este exemplo, assumiremos que um índice de texto completo foi criado na coluna Title .

DocumentID Title
1 Crank Arm and Tire Maintenance
2 Front Reflector Bracket and Reflector Assembly 3
3 Front Reflector Bracket Installation

Por exemplo, a tabela a seguir, que mostra o Fragment 1, descreve o conteúdo do índice de texto completo criado na coluna Title da tabela Document . Os índices de texto completo contêm mais informações do que é apresentado nessa tabela. A tabela é uma representação lógica de um índice de texto completo e é fornecida somente para fins de demonstração. As linhas são armazenadas em um formato compactado para otimizar o uso do disco.

Observe que os dados foram invertidos em relação aos documentos originais. A inversão ocorre porque as palavras-chave são mapeadas para as IDs de documento. Por esse motivo, geralmente um índice de texto completo é chamado de índice invertido.

Observe também que a palavra-chave "and" foi removida do índice de texto completo. Isso ocorre porque "and" é uma palavra irrelevante e remover essas palavras de um índice de texto completo pode levar a economias consideráveis do espaço em disco, melhorando o desempenho de consulta. Para obter mais informações sobre palavras irrelevantes, veja Configurar e gerenciar palavras irrelevantes (stop words) e listas de palavras irrelevantes para pesquisa de texto completo.

Fragmento 1

Palavra-chave ColId DocId Ocorrência
Crank 1 1 1
Arm 1 1 2
Tire 1 1 4
Manutenção 1 1 5
Front 1 2 1
Front 1 3 1
Reflector 1 2 2
Reflector 1 2 5
Reflector 1 3 2
Bracket 1 2 3
Bracket 1 3 3
Assembly 1 2 6
3 1 2 7
Instalação 1 3 4

A coluna Keyword contém uma representação de um único token extraído no momento da indexação. Os separadores de palavras determinam o que compõe um token.

A coluna ColId contém um valor que corresponde a uma coluna específica indexada com texto completo.

A DocId coluna contém valores para um inteiro de oito bytes que mapeia para um valor de chave de texto completo específico em uma tabela indexada de texto completo. Esse mapeamento é necessário quando a chave de texto completo não é um tipo de dados integer. Nesses casos, os mapeamentos entre valores de chave de texto completo e DocId valores são mantidos em uma tabela separada chamada tabela Mapeamento de DocId. Para examinar esses mapeamentos, use o procedimento armazenado do sistema sp_fulltext_keymappings . Para atender a um critério de pesquisa, os valores de DocId da tabela acima precisam ser unidos à tabela de mapeamento DocId para recuperar linhas da tabela base que está sendo consultada. Se o valor da chave de texto completo da tabela base for do tipo inteiro, o valor funcionará diretamente como DocId, e nenhum mapeamento será necessário. Por isso, o uso de valores de chave de texto completo pode ajudar a otimizar consultas de texto completo.

A coluna Occurrence contém um valor inteiro. Para cada valor de DocId, há uma lista de valores de ocorrência que correspondem aos deslocamentos relativos de palavras de uma palavra-chave específica dentro de DocId. Os valores de ocorrência são úteis para definir as correspondências de frase ou de proximidade, por exemplo, as frases têm valores de ocorrência numericamente adjacentes. Eles também são úteis para calcular pontuações de relevância; por exemplo, o número de ocorrências de uma palavra-chave em DocId pode ser usado na pontuação.

Neste tópico

Fragmentos de índice de texto completo

O índice de texto completo lógico normalmente é dividido entre várias tabelas internas. Cada tabela interna é chamada de fragmento de índice de texto completo. Alguns desses fragmentos podem conter dados mais novos do que outros. Por exemplo, se um usuário atualiza a linha a seguir cujo DocId é 3 e a tabela tem controle de alterações automático, é criado um novo fragmento.

DocumentID Title
3 Refletor traseiro

No exemplo a seguir, que mostra o Fragmento 2, o fragmento contém dados mais recentes sobre DocId 3 em comparação com Fragmento 1. Portanto, quando o usuário procura por “Refletor Traseiro", os dados de Fragmento 2 são usados para DocId 3. Cada fragmento é marcado com um carimbo de data/hora da criação, que pode ser consultado usando a exibição de catálogo sys.fulltext_index_fragments .

Fragmento 2

Palavra-chave ColId DocId Occ
Traseiro 1 3 1
Reflector 1 3 2

Como pode ser visto no Fragmento 2, as consultas de texto completo precisam examinar cada fragmento internamente e descartar entradas mais antigas. Por isso, um número excessivo de fragmentos de índice de texto completo no índice de texto completo pode levar a uma diminuição considerável do desempenho de consulta. Para reduzir o número de fragmentos, reorganize o catálogo de texto completo usando a opção REORGANIZE da instrução Transact-SQL ALTER FULLTEXT CATALOG. Essa instrução executa uma mesclagem mestraque mescla os fragmentos em um único fragmento maior e remove todas as entradas obsoletas do índice de texto completo.

Depois de reorganizado, o índice de exemplo conterá as linhas seguintes:

Palavra-chave ColId DocId Occ
Crank 1 1 1
Arm 1 1 2
Tire 1 1 4
Manutenção 1 1 5
Front 1 2 1
Traseiro 1 3 1
Reflector 1 2 2
Reflector 1 2 5
Reflector 1 3 2
Bracket 1 2 3
Assembly 1 2 6
3 1 2 7

Neste tópico