共用方式為


瞭解等級

Microsoft SQL Server 中的「全文檢索搜尋」可以產生分數 (等級值),以表示傳回之資料的相關性。每個資料列的等級值可視為順序條件,將其用來依相關性排序結果集。

ms142524.note(zh-tw,SQL.90).gif附註:
等級值僅會保留特定查詢的相關性,且不會保留任何跨查詢的重要性。

等級的統計資料

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

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

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

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

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

  • 屬性
    資料列的全文檢索索引資料行。
  • 文件
    在查詢中傳回的實體。在 SQL Server 中,它會對應至資料列。文件可以有多種屬性,就像資料列可以有多個全文檢索索引資料行。
  • 索引
    一或多個文件的單一反向索引。它可能完全位於記憶體或磁碟中。許多查詢統計資料會與符合項目的個別索引有關。
  • 全文檢索目錄
    被視為查詢的一個實體的中繼索引集合。目錄為 SQL Server 管理員可看見的組織單位。
  • 單字、Token 或項目
    全文檢索引擎中的比對單位。會依語言特有的文字分隔,將文件中的文字資料流 Token 化為字組或 Token。
  • 發生
    文件屬性中的文字位移,此文字位移由文字分隔來決定。第一個字是在發生 1,下個字是在發生 2,其餘依此類推。為避免誤報與近似查詢,句子的結尾與段落結尾會加入較大的發生間距。
  • 目錄索引鍵
    單字與包含該單字之屬性的組合。
  • HitCount
    資料列中出現的索引鍵值次數。
  • IndexedRowCount
    已編製索引的資料列總數。這會根據中繼索引中所維護的計數來計算。此數字在精確度上會有所不同。
  • KeyRowCount
    含有指定索引鍵之全文檢索目錄的資料列總數。
  • MaxOccurrence
    全文檢索目錄中針對特定屬性儲存在資料列中的發生次數最大值。
  • MaxQueryRank
    MSFTESQL 會傳回最大的等級是 1000。

等級計算問題

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

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

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 };

如果 top_n_by_rank 與新的預先計算等級選項一起搭配使用的話,則在計算等級時會進行一些額外的四捨五入,因此根據是否啟用預先計算等級選項而定,那些值可能會有些許差異。

CONTAINSTABLE 的等級

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

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

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 = S[key=1 to n] ContainsRankKey * WeightKey
Rank =  ( MaxQueryRank * WeightedSum ) / ( ( S[key=1 to n] ContainsRankKey2 ) 
      + ( S[key=1 to n] WeightKey2 ) - ( WeightedSum ) )

FREETEXT 的等級

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

Rank = S[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. 

請參閱

其他資源

CONTAINSTABLE (Transact-SQL)
FREETEXTTABLE (Transact-SQL)

說明及資訊

取得 SQL Server 2005 協助