Compartilhar via


Como os resultados de consultas de pesquisa são classificados (Pesquisa de Texto Completo)

A pesquisa de texto completo do SQL Server pode gerar uma pontuação (ou valor de classificação) opcional que indica a relevância dos dados retornados por uma consulta de texto completo. Este valor de classificação é calculado para cada linha e pode ser usado como critério de ordenação para classificar o conjunto de resultados de uma dada consulta por relevância. Os valores de classificação indicam apenas uma ordem relativa de relevância das linhas do conjunto de resultados. Os valores reais não são importantes e geralmente são diferentes em cada execução da consulta. O valor de classificação não guarda nenhuma importância entre as consultas.

ObservaçãoObservação

Para obter informações sobre como limitar os conjuntos de resultados classificados para que retornem somente os resultados mais relevantes, consulte Limitando conjuntos de resultados classificados (Pesquisa de Texto Completo).

Estatísticas para a classificação

Quando um índice é criado, as estatísticas são coletadas para serem usadas na classificação. O processo de construir um catálogo de texto completo não resulta diretamente em uma única estrutura de índice. Em vez disso, o Mecanismo de Texto Completo do SQL Server cria índices intermediários conforme os dados são indexados. O Mecanismo de Texto Completo então mescla esses índices em um índice maior, conforme necessário. Este processo pode ser repetido muitas vezes. Em seguida, o Mecanismo de Texto Completo conduz uma "mesclagem mestra" que combina todos os índices intermediários em um grande índice mestre.

As estatísticas são coletadas a cada nível de índice intermediário. As estatísticas são mescladas quando os índices são mesclados. Alguns valores estatísticos só podem ser gerados durante o processo de mesclagem mestra.

Ao classificar um conjunto de resultados da consulta, o SQL Server usa estatísticas do índice intermediário maior. Isto depende se os índices intermediários foram mesclados ou não. Como resultado, as estatísticas de classificação poderão variar em precisão se os índices intermediários tiverem sido mesclados. Isto explica porque a mesma consulta pode retornar diferentes resultados de classificação no decorrer do tempo conforme os dados indexados do texto completo são adicionados, modificados e excluídos; e conforme os índices menores são mesclados.

Para minimizar o tamanho do índice e a complexidade computacional, as estatísticas são sempre arredondadas.

A lista a seguir inclui alguns termos usados comumente e os valores estatísticos que são importantes para a classificação.

  • Propriedade
    Uma coluna indexada de texto completo da linha.

  • Documento
    A entidade retornada em consultas. Em SQL Server isso corresponde a uma linha. Um documento pode ter diversas propriedades, assim como uma linha pode ter diversas colunas indexadas de texto completo.

  • Índice
    Um único índice invertido de um ou mais documentos. Isto pode estar por inteiro na memória ou no disco. Muitas estatísticas de consulta são relativas ao índice individual onde a correspondência ocorreu.

  • Catálogo de texto completo
    Uma coleção de índices intermediários tratada como uma entidade para consultas. Catálogos são a unidade de organização visível para o administrador SQL Server.

  • Palavra, token ou item
    A unidade de correspondência no mecanismo de texto completo. Fluxos de texto de documentos são tokenizados em palavras ou tokens por separadores de palavras de um determinado idioma.

  • Ocorrência
    O deslocamento da palavra em uma propriedade de documento como determinado pelo separador de palavras. A primeira palavra está na ocorrência 1, a próxima na 2, e assim por diante. A fim de evitar falsos positivos em frase e consultas por proximidade, o término da oração e término do parágrafo introduz intervalos maiores de ocorrência.

  • TermFrequency
    O número de vezes que o valor da chave ocorre em uma linha.

  • IndexedRowCount
    Número total de linhas indexadas. Isto é computado com base nas contagens mantidas nos índices intermediários. Este número pode variar em precisão.

  • KeyRowCount
    Total de linhas no catálogo de texto completo que contém uma dada chave.

  • MaxOccurrence
    A maior ocorrência armazenada em um catálogo de texto completo a uma determinada propriedade em uma linha.

  • MaxQueryRank
    A classificação máxima, 1000, retornada pelo Mecanismo de Texto Completo.

Problemas na computação da classificação

O processo de computação da classificação depende de vários fatores. Separadores de palavra de idiomas diferentes tokenizam o texto de forma diferente. Por exemplo, a cadeia de caracteres “casa de cachorro” pode ser quebrada em “casa” “cachorro” por um separador de palavra e em “casa de cachorro” por outro separador de palavra. Isto significa que a correspondência e a classificação podem variar com base em um idioma específico, porque não só as palavras são diferentes como também o tamanho do documento. A diferença de tamanho do documento pode afetar a classificação para todas as consultas.

Estatísticas como IndexRowCount podem variar muito. Por exemplo, se um catálogo tem 2 bilhões de linhas no índice mestre, um novo documento será indexado no índice intermediário da memória, e a classificação daquele documento será com base no número de documentos no índice da memória que poderão ser inclinados quando comparados às classificações dos documentos do índice mestre. Por esta razão, recomenda-se que, após qualquer população que resulte em um grande número de linhas, os índices indexados ou re-indexados sejam mesclados em um índice mestre usando a função ALTER FULLTEXT CATALOG... Instrução Transact-SQL REORGANIZE. O Mecanismo de Texto Completo também mesclará automaticamente os índices com base em parâmetros como o número e o tamanho dos índices intermediários.

Os valores MaxOccurrence são normalizados em 1 de 32 intervalos. Isto significa, por exemplo, que um documento de 50 palavras é tratado da mesma forma que um documento de 100 palavras. Abaixo está a tabela usada para normalização. Devido aos tamanhos dos documentos estarem entre um intervalo de 32 e 128 na tabela adjacente, efetivamente, eles são tratados como se tivessem o mesmo tamanho, 128 (32 < docLength <= 128).

{ 16, 32, 128, 256, 512, 725, 1024, 1450, 2048, 2896, 4096, 5792, 8192, 11585, 
16384, 23170, 28000, 32768, 39554, 46340, 55938, 65536, 92681, 131072, 185363, 
262144, 370727, 524288, 741455, 1048576, 2097152, 4194304 };

Classificação do CONTAINSTABLE

A classificação CONTAINSTABLE usa o seguinte algoritmo:

StatisticalWeight = Log2( ( 2 + IndexedRowCount ) / KeyRowCount )
Rank = min( MaxQueryRank, HitCount * 16 * StatisticalWeight / MaxOccurrence )

As correspondências de frase são classificadas exatamente como as chaves individuais, com exceção da KeyRowCount (o número de linhas contendo a frase) que é estimada e pode não ser precisa e ser maior do que o número real.

Classificação do ISABOUT

CONTAINSTABLE dá suporte a consultas de termos ponderados usando a opção ISABOUT. ISABOUT é uma consulta do espaço de vetor na terminologia de recuperação de informações tradicionais. O algoritmo padrão de classificação usado é Jaccard, uma fórmula muito conhecida. A classificação é computada para cada termo na consulta e combinada como descrita abaixo.

ContainsRank = same formula used for CONTAINSTABLE ranking of a single term (above).
Weight = the weight specified in the query for each term. Default weight is 1.
WeightedSum = Σ[key=1 to n] ContainsRankKey * WeightKey
Rank =  ( MaxQueryRank * WeightedSum ) / ( ( Σ[key=1 to n] ContainsRankKey^2 ) 
      + ( Σ[key=1 to n] WeightKey^2 ) - ( WeightedSum ) )

Classificação de FREETEXTTABLE

A classificação de FREETEXTTABLE tem como base a fórmula de classificação OKAPI BM25. Consultas FREETEXTTABLE adicionarão palavras à consulta via geração por flexão (formas flexionadas das palavras originais da consulta); essas palavras são tratadas como palavras separadas, sem nenhuma relação especial com as palavras das quais foram geradas. Sinônimos gerados do recurso Thesaurus serão tratados como palavras separadas, em condições de igual equilíbrio. Cada palavra na consulta contribui para a classificação.

Rank = Σ[Terms in Query] w ( ( ( k1 + 1 ) tf ) / ( K + tf ) ) * ( ( k3 + 1 ) qtf / ( k3 + qtf ) ) )
Where: 
w is the Robertson-Sparck Jones weight. 
In simplified form, w is defined as: 
w = log10 ( ( ( r + 0.5 ) * ( N – R + r + 0.5 ) ) / ( ( R – r + 0.5 ) * ( n – r + 0.5 ) )
N is the number of indexed rows for the property being queried. 
n is the number of rows containing the word. 
K is ( k1 * ( ( 1 – b ) + ( b * dl / avdl ) ) ). 
dl is the property length, in word occurrences. 
avdl is the average length of the property being queried, in word occurrences. 
k1, b, and k3 are the constants 1.2, 0.75, and 8.0, respectively. 
tf is the frequency of the word in the queried property in a specific row. 
qtf is the frequency of the term in the query.