Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Banco de Dados SQL do Azure
Instância Gerenciada de SQL do Azure
As funções CONTAINSTABLE e FREETEXTTABLE retornam uma coluna chamada RANK que contém valores ordinais de 0 a 1.000 (valores de rank). Esses valores classificam as linhas de acordo com o quão bem elas correspondem aos critérios de seleção. Os valores de classificação indicam apenas uma ordem relativa de relevância das linhas no conjunto de resultados, sendo que um valor inferior indica menor relevância. Os valores reais são irrelevantes e normalmente diferem a cada execução da consulta.
Observação
Os predicados CONTAINS e FREETEXT não retornam nenhum valor de classificação.
O número de itens que correspondem a uma condição de pesquisa geralmente é grande. Para evitar que consultas CONTAINSTABLE ou FREETEXTTABLE retornem correspondências demais, use o parâmetro opcional top_n_by_rank. Ele retorna apenas um subconjunto de linhas.
top_n_by_rank é um valor inteiro, n, que especifica que somente as n correspondências com classificação mais alta sejam retornadas, em ordem decrescente. Se top_n_by_rank for combinado com outros parâmetros, a consulta retornará menos linhas do que o número de linhas que corresponde de fato a todos os predicados.
O Mecanismo de Banco de Dados do SQL Server ordena as correspondências por posição e retorna apenas até o número especificado de linhas. Por exemplo, uma consulta que normalmente retorna 100.000 de linhas de uma tabela de 1.000.000 de linhas é processada mais rapidamente se apenas as 100 primeiras linhas forem solicitadas.
Exemplos de uso do RANK para limitar resultados de busca
Exemplo A: Pesquisando apenas as três primeiras correspondências
O exemplo a seguir usa CONTAINSTABLE para retornar apenas as três primeiras correspondências.
USE AdventureWorks2025;
GO
SELECT K.RANK,
AddressLine1,
City
FROM Person.Address AS A
INNER JOIN CONTAINSTABLE (Person.Address, AddressLine1, 'ISABOUT ("des*",
Rue WEIGHT(0.5),
Bouchers WEIGHT(0.9))', 3) AS K
ON A.AddressID = K.[KEY];
GO
Veja a seguir o conjunto de resultados.
RANK Address City
----------- -------------------------------- ------------------------------
172 9005, rue des Bouchers Paris
172 5, rue des Bouchers Orleans
172 5, rue des Bouchers Metz
Exemplo B: pesquisando apenas as cinco primeiras correspondências
O exemplo a seguir usa CONTAINSTABLE para retornar a descrição dos cinco principais produtos cuja coluna Description contenha a palavra “aluminum” próxima às palavras light ou lightweight.
USE AdventureWorks2025;
GO
SELECT FT_TBL.ProductDescriptionID,
FT_TBL.Description,
KEY_TBL.RANK
FROM Production.ProductDescription AS FT_TBL
INNER JOIN CONTAINSTABLE (Production.ProductDescription,
Description, '(light NEAR aluminum) OR (lightweight NEAR aluminum)', 5) AS KEY_TBL
ON FT_TBL.ProductDescriptionID = KEY_TBL.[KEY];
GO
Como os resultados de consultas de pesquisa são classificados
A busca em texto integral pode gerar uma pontuação opcional (ou valor de rank) que indica a relevância dos dados retornados por uma consulta em texto completo. Esse valor de classificação é calculado em cada linha e pode ser usado como critério de ordenação para ordenar o conjunto de resultados de uma consulta dada 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 ranking não tem significado em diferentes consultas.
Estatísticas para a classificação
Quando você constrói um índice, o sistema coleta estatísticas para usar no ranking. Construir um catálogo em texto completo não cria diretamente uma única estrutura de índice. Em vez disso, o Full-Text Engine cria índices intermediários enquanto indexa dados. O Mecanismo de Texto Completo então mescla esses índices em um índice maior, conforme necessário. Esse processo pode acontecer 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.
Embora o Mecanismo de Banco de Dados classifique um conjunto de resultados de consulta, ele utiliza estatísticas do maior índice intermediário. Esse uso depende de se índices intermediários são fundidos. Como resultado, as estatísticas de classificação poderão ter variação na precisão se os índices intermediários não estiverem mesclados. Essa diferença de precisão explica por que a mesma consulta pode devolver resultados de classificação diferentes ao longo do tempo, à medida que dados indexados em texto completo são adicionados, modificados e excluídos, e à medida que os índices menores são fundidos.
Para minimizar o tamanho do índice e a complexidade computacional, as estatísticas são sempre arredondadas.
A lista a seguir inclui alguns termos comumente usados e os valores estatísticos que são importantes para a classificação.
| Termo / valor | Descrição |
|---|---|
| Propriedade | Uma coluna indexada de texto completo da linha. |
| Documento | A entidade retornada em consultas. No Mecanismo de Banco de Dados, isso corresponde a uma linha. Um documento pode ter diversas propriedades, assim como uma linha pode ter diversas colunas indexadas de texto completo. |
| Index | Um único índice invertido de um ou mais documentos. Pode estar totalmente 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 o que os administradores veem como a unidade da organização. |
| Palavra, token ou item | A unidade de correspondência no mecanismo de texto completo. Sequências de texto de documentos são tokenizadas em palavras ou tokens por segmentadores de palavras específicos para cada 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. Para evitar falsos positivos em consultas de frase e proximidade, o final da frase e o final do parágrafo introduzem lacunas maiores de ocorrência. |
| TermFrequency | O número de vezes que o valor-chave ocorre em sequência. |
| IndexedRowCount | Número total de linhas indexadas. Esse valor é calculado 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 no cálculo do ranking
Muitos fatores afetam o processo de cálculo do ranking. Separadores de palavra de idiomas diferentes convertem o texto em token de forma diferente. Por exemplo, um separador de palavras divide a cadeia de caracteres "dog-house" em "dog" e "house", mas outro separador de palavras a trata como "dog-house". A correspondência e a classificação variam de acordo com o idioma especificado, pois não só as palavras são diferentes, mas também o comprimento 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 é indexado em um índice intermediário em memória, e as classificações desse documento com base no número de documentos no índice em memória podem ser desequilibradas em comparação com as classificações dos documentos do índice mestre. Por esse motivo, após qualquer preenchimento que resulte em um grande número de linhas indexadas ou reindexadas, mescle os índices em um índice mestre usando a instrução Transact-SQL ALTER FULLTEXT CATALOG ... REORGANIZE. O Mecanismo de Texto Completo também mescla automaticamente os índices com base em parâmetros como o número e o tamanho dos índices intermediários.
Os valoresMaxOccurrence são normalizados em 1 de 32 intervalos. Essa normalização significa, por exemplo, que um documento de 50 palavras é tratado da mesma forma que um documento de 100 palavras. A tabela a seguir mostra a normalização. Como os tamanhos dos documentos estão no intervalo entre os valores 32 e 128 da tabela adjacente, 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 de CONTAINSTABLE
A classificação de CONTAINSTABLE usa o seguinte algoritmo:
StatisticalWeight = Log2( ( 2 + IndexedRowCount ) / KeyRowCount )
Rank = min( MaxQueryRank, HitCount * 16 * StatisticalWeight / MaxOccurrence )
As correspondências de frases são classificadas como as chaves individuais, exceto que o KeyRowCount (o número de linhas contendo a frase) é um valor estimado que pode ser impreciso e maior que o número real.
Posição da NEAR
CONTAINSTABLE oferece suporte a consultas de dois ou mais termos de pesquisa próximos entre si usando a opção NEAR. O valor de classificação de cada linha retornada baseia-se em vários parâmetros. Um fator de classificação principal é o número total de correspondências (ou ocorrências) relativo ao tamanho do documento. Dessa forma, se, por exemplo, um documento de 100 palavras e um documento de 900 palavras contiverem correspondências idênticas, o documento de 100 palavras terá uma classificação mais alta.
O comprimento total de cada ocorrência em uma linha também contribui para a classificação dessa linha com base na distância entre o primeiro e o último termos de pesquisa daquela ocorrência. Quanto menor a distância, mais a ocorrência contribuirá para o valor de classificação da linha. Se uma consulta em texto completo não especificar um inteiro como distância máxima, um documento que contém apenas resultados cujas distâncias são maiores que 100 termos lógicos de distância terá uma classificação de 0.
Classificação de ISABOUT
CONTAINSTABLE oferece suporte a consultas de termos ponderados usando a opção ISABOUT.
ISABOUT é uma consulta no espaço vetorial na terminologia tradicional de recuperação da informação. 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 conforme descrito no algoritmo 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. As consultas FREETEXTTABLE adicionam palavras à consulta por meio da geração flexional (formas flexionadas das palavras originais da consulta). Essas palavras são tratadas como palavras separadas, sem 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.