建立及管理全文檢索索引

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體

本文說明如何在 SQL Server Database Engine 中建立、填充及管理全文索引。 全文索引支援在表格中以字元為基礎的欄位進行關鍵字與語言搜尋。

建立全文檢索目錄

在建立全文索引之前,你需要有全文目錄。 目錄是一或多個全文檢索索引的虛擬容器。 欲了解更多資訊,請參閱 建立與管理 Full-Text 目錄。

建立、改變或卸除全文檢索索引

填入全文索引

建立與維護全文索引的過程稱為「填充」(也稱為「爬行索引」)。 全文索引填充有三種類型:

  • 全體人口
  • 基於變更追蹤的人口
  • 基於時間戳記的增量人口

如需詳細資訊,請參閱 填充全文索引。

檢視全文檢索索引的屬性

使用 Transact-SQL 檢視全文檢索索引的屬性

目錄或動態管理檢視 描述
sys.fulltext_index_catalog_usages 針對每個全文目錄與全文索引的關聯,各傳回一個資料列。
sys.fulltext_index_columns 每個屬於全文檢索索引一部分的資料行各自擁有一個資料列。
sys.fulltext_index_fragments 全文索引使用稱為全文索引片段的內部資料表來儲存反向索引資料。 你可以用這個視圖查詢這些片段的元資料。 此檢視表針對每一個資料表內包含全文檢索索引的每一個全文檢索索引片段各包含一個資料列。
sys.fulltext_indexes 針對表格式物件的每個全文檢索索引,各包含一個資料列。
sys.dm_fts_index_keywords 針對指定的資料表傳回全文索引內容的相關資訊。
sys.dm_fts_index_keywords_by_document 傳回有關指定資料表之全文檢索索引中文件層級內容的資訊。 給定的關鍵字可能會出現在許多份文件中。
sys.dm_fts_index_population 返回有關當前正在進行的全文索引資料填充的資訊。

使用 SQL Server Management Studio 檢視全文檢索索引的屬性

注意

若要檢視 Azure SQL 資料庫的全文檢索索引屬性,請使用 Transact-SQL。

  1. 在 SQL Server Management Studio 的 [物件總管] 中展開伺服器。

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

  3. 展開 資料表。

  4. 以滑鼠右鍵按一下已定義全文檢索索引的資料表,選取 [全文檢索索引],然後選取 [全文檢索索引] 操作功能表上的 [屬性]。 此動作會開啟 全文索引的屬性 對話框。

  5. 在 選取頁面 面板中,請選擇以下任一頁面:

    頁面 描述
    一般 顯示全文檢索索引的基本屬性。 這些屬性包含數個可修改的屬性及許多不可更改的屬性,例如資料庫名稱、資料表名稱及全文鍵列名稱。 可修改的屬性包括:

    全文檢索索引停用詞表

    全文檢索索引已啟用

    變更追蹤

    搜尋屬性清單
    欄位 顯示可用於全文檢索索引的資料表資料行。 系統會針對選取的資料行建立全文檢索索引。 您可以選取任意數目的可用資料行,以便包含在全文檢索索引中。 如需詳細資訊,請參閱 填充全文索引。
    排程 您可以使用這個頁面來建立或管理 SQL Server Agent 作業的排程,以便針對全文檢索索引集合啟動增量資料表填充。 如需詳細資訊,請參閱 填充全文索引。

    注意:結束 全文索引屬性 對話方塊後,任何新建立的排程都會與一項 SQL Server Agent 作業相關聯(在 database_name.table_name 上啟動資料表增量填入)。
  6. 選取 [確定],儲存任何變更並結束 [全文檢索索引屬性] 對話方塊。

檢視索引資料表和資料行的屬性

你可以使用多種 Transact-SQL 函數,例如 OBJECTPROPERTYEX,來取得各種全文索引屬性的值。 此資訊對於管理及疑難排解全文檢索有助益。

下表列出與索引資料表和資料行相關的全文檢索屬性,及其相關的 Transact-SQL 函式。

屬性 描述 函式
FullTextTypeColumn TYPE COLUMN 在存放該欄位的文件類型資訊的表格中。 COLUMNPROPERTY
IsFulltextIndexed 指定欄位是否啟用全文索引。 COLUMNPROPERTY
IsFulltextKey 索引是否為資料表的全文索引鍵。 INDEXPROPERTY
TableFulltextBackgroundUpdateIndexOn 資料表是否具有背景更新的全文檢索索引。 OBJECTPROPERTYEX
TableFulltextCatalogId 資料表的全文索引資料所位於的全文目錄識別碼。 OBJECTPROPERTYEX
表格全文變更追蹤開啟 資料表是否已啟用全文變更追蹤功能。 OBJECTPROPERTYEX
全文文件處理表 全文檢索索引啟動之後所處理的資料列數。 OBJECTPROPERTYEX
TableFulltextFailCount 未被全文檢索編製索引的資料列數。 OBJECTPROPERTYEX
TableFulltextItemCount 已成功全文檢索索引的資料列數。 OBJECTPROPERTYEX
TableFulltextKeyColumn 全文檢索唯一索引鍵資料行的資料行識別碼。 OBJECTPROPERTYEX
TableFullTextMergeStatus 具有全文檢索索引的資料表目前是否正在合併。 OBJECTPROPERTYEX
TableFulltextPendingChanges 待處理的變更追蹤項目數量。 OBJECTPROPERTYEX
TableFulltextPopulateStatus 全文表格的母體狀態描述。 OBJECTPROPERTYEX
TableHasActiveFulltextIndex 資料表是否有一個啟用的全文檢索索引。 OBJECTPROPERTYEX

取得全文索引鍵資料行的相關資訊

通常,你會將 或 CONTAINSTABLE 列集值函式的結果FREETEXTTABLE與基底資料表結合。 在這種情況下,您必須知道主鍵資料行名稱。 你可以檢查某個唯一索引是否被用作全文鍵,並取得全文鍵欄位的識別碼。

判斷給定的唯一索引是否用作全文索引鍵資料行使用

使用 SELECT 陳述式來呼叫 INDEXPROPERTY 函數。 在函式呼叫中,使用 OBJECT_ID 函式將資料表名稱(table_name)轉換成資料表 ID,指定資料表唯一索引名稱,並指定 IsFulltextKey 索引屬性,具體如下:

SELECT INDEXPROPERTY(OBJECT_ID('table_name'), 'index_name', 'IsFulltextKey');

此陳述式會在索引對全文檢索索引鍵資料行強制執行唯一性時傳回 1,若未強制執行則傳回 0。

範例

以下範例檢查索引是否 PK_Document_DocumentNode 強制全文鍵欄位的唯一性:

USE AdventureWorks2025;
GO

SELECT INDEXPROPERTY(OBJECT_ID('Production.Document'), 'PK_Document_DocumentNode', 'IsFulltextKey');

若索引 PK_Document_DocumentNode 強制全文鍵欄唯一性,則此範例回傳 1。 否則,則回傳 0 或 NULL。 NULL 代表你使用的是無效的索引名稱,該索引名稱與資料表不對應,資料表不存在,等等。

尋找全文文字鍵欄的識別碼

每個啟用全文檢索的資料表都有一個可確保該資料表中的每個資料列皆為唯一的資料行(即 唯一 索引鍵資料行)。 TableFulltextKeyColumn該屬性由OBJECTPROPERTYEX函式取得,包含唯一金鑰欄位的欄位 ID。

要取得這個識別碼,請使用會呼叫 OBJECTPROPERTYEX 函式的 SELECT 陳述式。 使用函 OBJECT_ID 式將資料表名稱(table_name)轉換成資料表 ID,並指定 TableFulltextKeyColumn 屬性,如下:

SELECT OBJECTPROPERTYEX(OBJECT_ID('table_name'), 'TableFulltextKeyColumn') AS 'Column Identifier';

範例

以下範例回傳全文鍵欄位的識別碼。NULL NULL 這表示你使用的索引名稱無效,索引名稱與表格不對應,表格不存在,等等。

USE AdventureWorks2025;
GO

SELECT OBJECTPROPERTYEX(OBJECT_ID('Production.Document'), 'TableFulltextKeyColumn');
GO

以下範例展示如何使用唯一金鑰欄位的識別碼來取得欄位名稱。

USE AdventureWorks2025;
GO

DECLARE @key_column AS SYSNAME;

SET @key_column = COL_NAME(
    OBJECT_ID('Production.Document'),
    OBJECTPROPERTYEX(OBJECT_ID('Production.Document'), 'TableFulltextKeyColumn')
);

SELECT @key_column AS 'Unique Key Column';
GO

此範例會傳回名為 Unique Key Column 的結果集欄位,其中顯示包含 Document 資料表之唯一鍵欄位名稱的單一資料列 DocumentNode。 如果這個查詢包含無效的索引名稱,該索引名稱與資料表不對應,資料表不存在,等等,則會回傳 NULL。

索引 varbinary(max) 和 XML 欄位

如果您對 varbinary(max)、varbinary 或 xml 欄位建立全文索引,就可以像查詢其他已建立全文索引的欄位一樣,使用全文檢索述詞(CONTAINS 和 FREETEXT)及函式(CONTAINSTABLE 和 FREETEXTTABLE)來查詢它。

索引 varbinary(max) 或 varbinary 資料

單一 varbinary(max) 或 varbinary 資料行可以儲存許多類型的文件。 資料庫引擎支援任何已在作業系統中安裝且可用對應篩選器的文件類型。 每份文件的文件類型都是由文件的副檔名所識別。 例如,對於.doc檔案副檔名,全文搜尋會使用支援 Microsoft Word 文件的篩選器。 如需可用文件類型的清單,請查詢 sys.fulltext_document_types 目錄檢視。

全文檢索引擎可以使用在作業系統中安裝的現有篩選器。 您必須先將操作系統的篩選器、斷詞工具和字幹分析器載入伺服器執行個體中,才能使用它們,如下所示:

EXECUTE sp_fulltext_service
    @action = 'load_os_resources',
    @value = 1;

若要針對 varbinary(max) 資料行建立全文檢索索引,全文檢索引擎需要 varbinary(max) 資料行中文件副檔名的存取權。 你必須將這些資訊儲存在一個稱為型別欄位的資料表欄位中,該欄位與全文索引中的 varbinary(max) 欄位關聯。 建立文件的索引時,全文檢索引擎會使用類型資料行中的副檔名來識別要使用的篩選。

索引 XML 資料

xml 資料類型資料行只會儲存 XML 文件和片段,而且只有 XML 篩選會用於這些文件。 因此,類型資料行是不必要的。 在 xml 資料行上,全文檢索索引會建立 XML 元素內容的索引,但忽略 XML 標記。 屬性值會被全文索引,除非它們是數值型的。 元素標記會當做 Token 界限來使用。 系統支援包含多種語言且格式正確的 XML 或 HTML 文件和片段。

欲了解更多關於 XML 欄位索引與查詢的資訊,請參閱 「使用 XML 欄位的全文搜尋」。

停用或重新啟用資料表的全文檢索索引

在 資料庫引擎 中,所有使用者建立的資料庫預設皆啟用全文。 此外,個別資料表也會在建立全文檢索索引並將資料行加入索引中後,立即自動啟用全文檢索索引。 從全文檢索索引中卸除最後一個資料行之後,資料表便會自動停用全文檢索索引。

在有全文索引的資料表上,你可以使用 SQL Server Management Studio 手動停用或重新啟用該資料表以進行全文索引。

  1. 展開伺服器群組,展開 [資料庫],然後展開包含您想要為其啟用全文索引的資料表所在的資料庫。

  2. 展開 [資料表] ,然後以滑鼠右鍵按一下您想要停用或重新啟用全文檢索索引的資料表。

  3. 選取 [全文檢索索引],然後選取 [停用全文檢索索引] 或 [啟用全文檢索索引]。

移除資料表的全文索引

  1. 在 [物件總管] 中,以滑鼠右鍵按一下含有您要刪除其全文檢索索引的資料表。

  2. 選取 <刪除全文檢索索引>。

  3. 出現提示要您確認是否要刪除全文檢索索引時,請選取 [確定]。