全文檢索索引結構

若能充分了解全文檢索索引的結構,將有助於了解全文檢索引擎的運作方式。本主題會使用下列 Adventure Works 之 Document 資料表的摘錄當做範例資料表。這個摘錄只會顯示該資料表中的兩個資料行 (DocumentID 資料行和 Title 資料行) 和三個資料列。

[!附註]

如需有關此範例資料表之資料行的詳細資訊,請參閱<Document 資料表 (AdventureWorks)>。

就這個例子而言,我們會假設已經在 Title 資料行中建立了全文檢索索引。

DocumentID

Title

1

Crank Arm and Tire Maintenance

2

Front Reflector Bracket and Reflector Assembly 3

3

Front Reflector Bracket Installation

例如,下表 (顯示片段 1) 會描述針對 Document 資料表之 Title 資料行所建立的全文檢索索引內容。全文檢索索引所包含的資訊會比顯示在此資料表中的資訊還要多。此資料表是全文檢索索引的邏輯表示法,僅針對示範目的提供。這些資料列會以壓縮的格式儲存,以便最佳化磁碟使用量。

請注意,資料已經與原始文件相反。因為關鍵字會對應至文件識別碼,所以會發生相反的情況。因此,全文檢索索引通常稱為反向索引。

此外,請注意,關鍵字 "and" 已經從全文檢索索引中移除了。進行此作業的原因是 "and" 是停用字詞,而且從全文檢索索引中移除停用字詞可能會大幅節省磁碟空間,進而改善查詢效能。如需有關停用字詞的詳細資訊,請參閱<停止字詞和停止清單>。

片段 1

Keyword

ColId

DocId

Occurrence

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

Keyword 資料行包含編列索引時所擷取的單一 Token 表示法。文字分隔會決定 Token 的組成項目。

ColId 資料行所包含的值會對應到已建立全文檢索索引的特定資料行。

DocId 資料行含有八位元組整數的值,此整數會對應到全文檢索索引資料表中的特定全文檢索索引鍵值。當全文檢索索引鍵不是整數資料類型時,這項對應就是必要的。在這類情況下,全文檢索索引鍵值與 DocId 值之間的對應會保存在稱為 DocId Mapping 資料表的個別資料表中。若要查詢這些對應,請使用 sp_fulltext_keymappings 系統預存程序。為了滿足搜尋條件,上述資料表中的 DocId 值必須與 DocId Mapping 資料表聯結,以便從查詢的基底資料表中擷取資料列。如果基底資料表的全文檢索索引鍵值是整數類型,此值就會直接當做 DocId 而且不需要任何對應。因此,使用整數全文檢索索引鍵值有助於最佳化全文檢索查詢。

Occurrence 資料行包含整數值。針對每個 DocId 值,都會有一個對應到該 DocId 內特定關鍵字之相對單字位移的出現次數值清單。出現次數值有助於決定詞句或相似的相符項目,例如,具有鄰近發生次數值的片語。它們也有助於計算相關分數。例如,在 DocId 中的關鍵字出現次數可用來計分。

全文檢索索引片段

邏輯全文檢索索引通常會在多份內部資料表之間分割。每份內部資料表會稱為全文檢索索引片段。其中某些片段可能包含比其他片段更新的資料。例如,如果使用者更新 DocId 為 3 的下列資料列,而且資料表已進行自動變更追蹤,就會建立新的片段。

DocumentID

Title

3

Rear Reflector

在下列範例 (顯示片段 2) 中,此片段包含的 DocId 3 相關資料比片段 1 更新。因此,當使用者查詢 "Rear Reflector" 時,片段 2 的資料就會用於 DocId 3。每個片段都會以建立時間戳記標示,而且您可以使用 sys.fulltext_index_fragments 目錄檢視來查詢此時間戳記。

片段 2

Keyword

ColId

DocId

Occ

Rear

1

3

1

Reflector

1

3

2

如片段 2 所示,全文檢索查詢必須在內部查詢每個片段並捨棄較舊的項目。因此,如果全文檢索索引包含過多全文檢索索引片段,可能會導致查詢效能大幅降低。若要減少片段的數目,請使用 ALTER FULLTEXT CATALOGTransact-SQL 陳述式的 REORGANIZE 選項來重新組織全文檢索目錄。這個陳述式會執行「主要合併」(Master Merge),將片段合併成較大的單一片段,然後從全文檢索索引中移除所有已過時的項目。

重新組織之後,範例索引就會包含下列資料列:

Keyword

ColId

DocId

Occ

Crank

1

1

1

Arm

1

1

2

Tire

1

1

4

Maintenance

1

1

5

Front

1

2

1

Rear

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