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 Fragmento1, 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, consulte Palavras irrelevantes e listas de palavras irrelevantes.

Fragmento 1

Palavra-chave

ColId

DocId

Ocorrência

Crank

1

1

1

Arm

1

1

2

Tire

1

1

4

Maintenance

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

Installation

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 coluna DocId contém valores para um inteiro de oito bytes que é mapeado para um valor de chave de texto completo específico em uma tabela indexada com texto completo. Esse mapeamento é necessário quando a chave de texto completo não é um tipo de dados integer. Em casos como esses, os mapeamentos entre valores de chave de texto completo e valores da coluna DocId são mantidos em uma tabela à parte, chamada tabela de mapeamento 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.

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

Título

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 do 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 ALTER FULLTEXT CATALOGTransact-SQL. Essa instrução executa uma mesclagem mestra que 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

Maintenance

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