擴展全文檢索索引

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體

建立和維護全文檢索索引包括使用稱為「母體擴展」(Population) (也稱為「搜耙」(Crawl)) 的處理序來擴展索引。

Types of population

全文檢索索引支援下列類型的母體擴展:

  • 完整母體擴展
  • 變更追蹤為基礎的自動或手動母體擴展
  • 時間戳記為基礎的累加母體擴展

完整母體擴展

在完整母體擴展期間,系統會針對資料表或索引檢視表的所有資料列建立索引項目。 全文檢索索引的完整母體擴展會針對基底資料表或索引檢視表的所有資料列建立索引項目。

根據預設, SQL Server 會在建立新的全文檢索索引時,立即進行完整的母體擴展。

  • 相反的,完整母體擴展可能會耗用大量資源。 因此,在尖峰期間建立全文檢索索引時,最佳作法通常是延遲完整母體擴展直到離峰時間為止,尤其是全文檢索索引的基底資料表很龐大時。
  • 相反地,此索引所屬的全文檢索目錄要等到所有全文檢索索引都擴展之後才能使用。

若要建立全文檢索索引,但不立即擴展,請在 CREATE FULLTEXT INDEX 陳述式中指定 CHANGE_TRACKING OFF, NO POPULATION 子句。 如果您指定 CHANGE_TRACKING MANUAL,則在使用 START FULL POPULATIONSTART INCREMENTAL POPULATION 子句來執行 ALTER FULLTEXT INDEX 陳述式之前,全文檢索引擎不會擴展新的全文檢索索引。

範例 - 建立全文檢索索引但不執行完整母體擴展

下列範例會針對 Production.Document 範例資料庫的 AdventureWorks 資料表建立全文檢索索引。 這個範例會使用 WITH CHANGE_TRACKING OFF, NO POPULATION 來延遲初始完整母體擴展。

CREATE UNIQUE INDEX ui_ukDoc ON Production.Document(DocumentID);  
CREATE FULLTEXT CATALOG AW_Production_FTCat;  
CREATE FULLTEXT INDEX ON Production.Document  
(  
    Document                         --Full-text index column name   
        TYPE COLUMN FileExtension    --Name of column that contains file type information  
        Language 1033                 --1033 is LCID for the English language  
)  
    KEY INDEX ui_ukDoc  
    ON AW_Production_FTCat  
    WITH CHANGE_TRACKING OFF, NO POPULATION;  
GO  
  

範例 - 執行資料表的完整母體擴展

下列範例會針對 Production.Document 範例資料庫的 AdventureWorks 資料表執行完整母體擴展。

ALTER FULLTEXT INDEX ON Production.Document  
   START FULL POPULATION;  

以變更追蹤為基礎的母體擴展

在初始完整母體擴展之後,您可以選擇性地使用變更追蹤來維護全文檢索索引。 由於 SQL Server 維護的資料表,會追蹤上一次母體擴展以來對基底資料表所做的變更,因此存在與變更追蹤相關聯的少量負荷。 使用變更追蹤時,SQL Server 會在基底資料表或索引檢視表中維護已由更新、刪除或插入作業所修改的資料列記錄。 透過 WRITETEXT 和 UPDATETEXT 進行的資料變更並不會反映在全文檢索索引中,變更追蹤並不會收取這些變更。

注意

如需包含 timestamp 資料行的資料表,您可以使用累加母體擴展,而非變更追蹤。

在建立索引期間啟用變更追蹤時,SQL Server 會在建立新的全文檢索索引時,立即進行完整的母體擴展。 之後,系統會追蹤並傳播變更至全文檢索索引。

啟用變更追蹤

有兩種類型的變更追蹤:

  • 自動 (CHANGE_TRACKING AUTO 選項)。 自動變更追蹤是預設的行為。
  • 手動 (CHANGE_TRACKING MANUAL 選項)。

變更追蹤的類型會決定擴展全文檢索索引的方式,如下所示:

  • 自動母體擴展

    根據預設,或者如果您指定 CHANGE_TRACKING AUTO,全文檢索引擎就會針對全文檢索索引使用自動母體擴展。 初始完整母體擴展完成之後,系統就會追蹤變更,因為基底資料表中的資料已修改,而且追蹤的變更會自動傳播。 不過,全文檢索索引會在背景更新,所以傳播的變更可能不會立即反映在索引中。

    使用自動母體擴展來設定追蹤變更

    範例 - 將全文檢索索引更改成使用自動變更追蹤
    下列範例會將 HumanResources.JobCandidate 範例資料庫之 AdventureWorks 資料表的全文檢索索引變更成使用變更追蹤搭配自動母體擴展。

    USE AdventureWorks;  
    GO  
    ALTER FULLTEXT INDEX ON HumanResources.JobCandidate SET CHANGE_TRACKING AUTO;  
    GO   
    
  • 手動母體擴展

    如果您指定了 CHANGE_TRACKING MANUAL,全文檢索引擎就會針對全文檢索索引使用手動母體擴展。 初始完整母體擴展完成之後,系統就會追蹤變更,因為基底資料表中的資料已修改。 不過,它們不會傳播至全文檢索索引,直到您執行 ALTER FULLTEXT INDEX ...START UPDATE POPULATION 陳述式來手動套用變更。 您可以使用 SQL Server Agent 來定期呼叫這個 Transact-SQL 陳述式。

    若要使用手動母體擴展來啟動追蹤變更

    範例 - 使用手動變更追蹤來建立全文檢索索引
    下列範例會針對 HumanResources.JobCandidate 範例資料庫的 AdventureWorks 資料表建立使用變更追蹤搭配手動母體擴展的全文檢索索引。

    USE AdventureWorks;  
    GO  
    CREATE UNIQUE INDEX ui_ukJobCand ON HumanResources.JobCandidate(JobCandidateID);  
    CREATE FULLTEXT CATALOG ft AS DEFAULT;  
    CREATE FULLTEXT INDEX ON HumanResources.JobCandidate(Resume)   
       KEY INDEX ui_ukJobCand   
       WITH CHANGE_TRACKING=MANUAL;  
    GO  
    

    範例 - 執行手動母體擴展
    下列範例會針對 HumanResources.JobCandidate 範例資料庫之 AdventureWorks 資料表的變更追蹤全文檢索索引執行手動母體擴展。

    USE AdventureWorks;  
    GO  
    ALTER FULLTEXT INDEX ON HumanResources.JobCandidate START UPDATE POPULATION;  
    GO  
    

停用變更追蹤

以時間戳記為基礎的累加母體擴展

累加母體擴展是手動擴展全文檢索索引的替代機制。 如果資料表遇到大量插入作業,使用累加母體擴展可能會比使用手動母體擴展更有效率。

您可以針對將 CHANGE_TRACKING 設定為 MANUAL 或 OFF 的全文檢索索引執行累加母體擴展。

累加母體擴展的執行要件是,索引資料表必須包含 timestamp 資料類型資料行。 少了 timestamp 資料行,就無法執行累加母體擴展。

SQL Server 會使用 timestamp 資料行來識別上一次母體擴展以來已變更的資料列。 然後,累加母體擴展會針對在上一次母體擴展之後或進行時加入、刪除或修改的資料列,更新全文檢索索引。 母體擴展結束時,全文檢索引擎會記錄新的 timestamp 值。 這個值就是「SQL 收集程式」所找到的最大 timestamp 值。 此值會在下次累加母體擴展啟動時使用。

在某些情況下,累加母體擴展要求會導致完整母體擴展。

  • 對不含 timestamp 資料行的資料表提出累加母體擴展要求的話,會導致執行完整母體擴展作業。
  • 如果全文檢索索引的第一個母體擴展是累加母體擴展,它就會建立所有資料列的索引,讓它相當於完整母體擴展。
  • 如果上一次母體擴展以來,影響資料表全文檢索索引的任何中繼資料已變更,便會以完整母體擴展的方式實作累加母體擴展。 這包括由於更改任何資料行、索引或全文檢索索引定義所導致的中繼資料變更。

執行累加母體擴展

若要執行累加母體擴展,請使用 START INCREMENTAL POPULATION 子句來執行 ALTER FULLTEXT INDEX 陳述式。

建立或變更累加母體擴展的排程

  1. 在 Management Studio 中,於 [物件總管] 中展開伺服器。

  2. 展開 [資料庫],然後展開包含全文檢索索引的資料庫。

  3. 展開 [資料表]

    以滑鼠右鍵按一下已定義全文檢索索引的資料表、選取 [全文檢索索引],然後按一下 [全文檢索索引] 內容功能表上的 [屬性]。 這樣就會開啟 [全文檢索索引屬性] 對話方塊。

    重要

    如果基底資料表或檢視表未包含 timestamp 資料類型的資料行,則無法執行累加母體擴展。

  4. 在 [選取頁面] 窗格中,選取 [排程]。

    您可以使用這個頁面來建立或管理 SQL Server Agent 作業的排程,以便針對全文檢索索引的基底資料表或索引檢視表啟動累加資料表母體擴展。

    選項如下:

    • 若要建立新的排程,請按一下 [新增]。

      這樣就會開啟 [新增全文檢索索引資料表排程] 對話方塊,可讓您建立排程。 若要儲存排程,請按一下 [確定]。

      重要

      在您結束 [全文檢索索引屬性] 對話方塊之後,SQL Server Agent 作業 (針對 <資料庫名稱>.<資料表名稱> 啟動累加資料表母體擴展) 就會與新的排程相關聯。 如果您針對相同的全文檢索索引建立多個排程,它們都會使用相同的作業。

    • 若要變更現有排程,請選取現有排程,然後按一下 [編輯]。

      這樣就會開啟 [新增全文檢索索引資料表排程] 對話方塊,可讓您修改排程。

      注意

      如需修改 SQL Server Agent 作業的資訊,請參閱修改作業

    • 若要移除現有排程,請選取現有排程,然後按一下 [刪除]。

  5. 選取 [確定]。

為全文檢索母體擴展 (搜耙) 中的錯誤疑難排解

搜耙發生錯誤時,「全文檢索搜尋」搜耙記錄功能會建立並維護搜耙記錄檔,此記錄檔是一個純文字檔。 每個搜耙記錄檔都對應至特定的全文檢索目錄。 所指定執行個體 (在此範例中為預設執行個體) 的編目記錄檔預設位於 %ProgramFiles%\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\LOG 資料夾中。

搜耙記錄檔會遵循下列命名結構:

SQLFT<DatabaseID><FullTextCatalogID>.LOG[<n>]

以下是編目記錄檔名稱的變動部分。

  • <DatabaseID> - 資料庫的識別碼。 <dbid> 是開頭為零的五位數數字。
  • <FullTextCatalogID> - 全文檢索目錄識別碼。 <catid> 是開頭為零的五位數數字。
  • <n> - 是一個整數,指示相同全文檢索目錄的編目記錄檔數目。

例如,SQLFT0000500008.2 是指資料庫識別碼 = 5 而且全文檢索目錄識別碼 = 8 之資料庫的編目記錄檔。 位於檔案名稱結尾的 2 表示此資料庫/目錄組有兩個搜耙記錄檔。

另請參閱

sys.dm_fts_index_population (Transact-SQL)
全文檢索搜尋使用者入門
建立及管理全文檢索索引
CREATE FULLTEXT INDEX (Transact-SQL)
ALTER FULLTEXT INDEX (Transact-SQL)