搜尋查詢結果如何排序等級 (全文檢索搜尋)

SQL Server 中的全文檢索搜尋可以產生選擇性分數 (或等級值),表示全文檢索查詢傳回之資料的相關性。這個等級值是針對每個資料列計算的,而且可當做排序準則使用,以便依據相關性排序給定查詢的結果集。等級值僅表示結果集中資料列相關性的相對順序。實際的值並不重要,而且每次執行查詢後該值通常會不一樣。等級值不會在查詢之間保存任何重要性。

[!附註]

如需有關將等級排序結果集限制為僅傳回最相關結果的詳細資訊,請參閱<限制等級排序結果集 (全文檢索搜尋)>。

等級的統計資料

建立索引時會收集統計資料供評定等級使用。建立全文檢索目錄的程序並不會直接導致單一索引結構。相反地,Full-Text Engine for SQL Server 會在編製資料索引時建立中繼索引。接著,全文檢索引擎會視需要將這些索引合併到較大的索引。此程序可以重複許多次。接著,全文檢索引擎會執行「主要合併」,將所有的中繼索引合併至較大的主索引。

統計資料是在每個中繼索引層級中收集。合併索引時會合併統計資料。某些統計資料只能在主要合併程序期間產生。

計算查詢結果集的等級時,SQL Server 會使用最大中繼索引的統計資料。需視中繼索引合併與否而定。因此,如果中繼索引尚未合併,等級統計資料的精確度可能會有所變動。這能解釋為何在新增、修改、刪除全文檢索索引資料,以及在合併較小的索引時,相同的查詢會傳回不同的等級結果。

為了降低索引大小與計算的複雜度,通常會將統計資料四捨五入。

下列清單包含一些計算等級時常用的重要詞彙與統計資料值。

  • 屬性
    資料列的全文檢索索引資料行。

  • 文件
    在查詢中傳回的實體。在 SQL Server 中,它會對應至資料列。文件可以有多種屬性,就像資料列可以有多個全文檢索索引資料行。

  • 索引
    一或多個文件的單一反向索引。它可能完全位於記憶體或磁碟中。許多查詢統計資料會與符合項目的個別索引有關。

  • 全文檢索目錄
    被視為查詢的一個實體的中繼索引集合。目錄為 SQL Server 管理員可看見的組織單位。

  • 單字、Token 或項目
    全文檢索引擎中的比對單位。會依語言特有的文字分隔,將文件中的文字資料流 Token 化為字組或 Token。

  • 發生
    文件屬性中的文字位移,此文字位移由文字分隔來決定。第一個字是在發生 1,下個字是在發生 2,其餘依此類推。為避免誤報與近似查詢,句子的結尾與段落結尾會加入較大的發生間距。

  • TermFrequency
    資料列中出現的索引鍵值次數。

  • IndexedRowCount
    已編製索引的資料列總數。這會根據中繼索引中所維護的計數來計算。此數字在精確度上會有所不同。

  • KeyRowCount
    含有指定索引鍵之全文檢索目錄的資料列總數。

  • MaxOccurrence
    全文檢索目錄中針對特定屬性儲存在資料列中的發生次數最大值。

  • MaxQueryRank
    全文檢索引擎會傳回最大的等級是 1000。

等級計算問題

計算等級的程序取決於幾項因素。不同語言的文字在分隔 Token 化文字的方式上會有所差異。例如,使用某種文字分隔時會將 "dog-house" 字串分解成 "dog" "house",而使用另一種文字分隔時會分解成 "dog-house"。這表示比對和等級會依據指定的語言而異,因為不僅單字不同,而且文件長度也不同。文件長度的差異會影響所有查詢的等級。

統計資料 (例如 IndexRowCount) 可能會有很大的差異。例如,如果某個目錄在主索引中有 20 億個資料列,則會將一個新文件的索引編製到記憶體的中繼索引。而該文件會根據記憶體索引中的文件數目所得的等級,與主索引的文件等級進行非對稱比較。因此,建議您在執行任何會針對大量資料列編製索引或重新編製索引的母體擴展動作後,使用 ALTER FULLTEXT CATALOG ... REORGANIZE DDL 陳述式來將這些索引與主要的索引合併。REORGANIZE Transact-SQL 陳述式。全文檢索引擎也會根據參數 (例如中繼索引的數目與大小) 來自動合併索引。

MaxOccurrence 值會正規化為 32 種範圍中的其中一種。這表示,會將長度 50 個字的文件視為與長度 100 個字的文件一樣。下表用於正規化作業。因為這兩個文件的長度介於鄰近資料表值的 32 與 128,因此它們會被視為具有相同長度的文件,也就是 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 };

CONTAINSTABLE 的等級

CONTAINSTABLE 等級會使用下列演算法:

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

片語比對會像個別索引鍵一樣來分級,但是會估計 KeyRowCount 值 (含有片語的資料列數目),而且該值可能不正確並高於實際值。

ISABOUT 的等級

CONTAINSTABLE 支援使用 ISABOUT 選項來查詢加權詞彙。ISABOUT 是傳統資訊擷取詞彙中的向量空間查詢。預設使用的等級演算法是 Jaccard,這是一個相當有名的公式。會針對查詢中的每個詞彙計算等級,然後進行結合,如下表所述。

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 ) )

FREETEXTTABLE 的等級

FREETEXTTABLE 等級是以 OKAPI BM25 等級公式為基礎。FREETEXTTABLE 查詢會透過變化衍生項 (原始查詢字的變化型式) 將單字加入到查詢中。這些單字會視為個別單字,而且與來源產生字沒有特殊的關聯性。由「同義字」功能所產生的同義字會視為個別詞彙,且加權值相同的詞彙。查詢中的每個單字都是計算等級的基礎。

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.