CREATE FULLTEXT INDEX (Transact-SQL)

針對資料庫中的某份資料表或索引檢視表建立全文檢索索引。每個資料表或索引檢視表只允許有一個全文檢索索引,而且每個全文檢索索引都會套用至單一資料表或索引檢視表。

全文檢索索引最多可包含 1024 個資料行。

主題連結圖示Transact-SQL 語法慣例

語法

CREATE FULLTEXT INDEX ON table_name
      [ ( { column_name 
             [ TYPE COLUMN type_column_name ]
             [ LANGUAGE language_term ] 
        } [ ,...n] 
            ) ]
    KEY INDEX index_name 
        [ ON <catalog_filegroup_option> ]
        [ WITH [ ( ] <with_option> [ ,...n] [ ) ] ]
[;]

<catalog_filegroup_option>::=
  {
        fulltext_catalog_name 
  | ( fulltext_catalog_name, FILEGROUP filegroup_name )
  | ( FILEGROUP filegroup_name, fulltext_catalog_name )
  | ( FILEGROUP filegroup_name )
  }

<with_option>::=
  {
   CHANGE_TRACKING [ = ] { MANUAL | AUTO | OFF [, NO POPULATION ] } 
  | STOPLIST [ = ] { OFF | SYSTEM | stoplist_name }
  }

引數

  • table_name
    這是包括在全文檢索索引中之一個或多個資料行所在的資料表或索引檢視表名稱。

  • column_name
    這是包含在全文檢索索引中的資料行名稱。只有 char、varchar、nchar、nvarchar、text、ntext、image、xml、varbinary 和 varbinary(max) 類型的資料行可以建立全文檢索搜尋的索引。若要指定多重資料行,請重複 column_name 子句,如下所示:

    CREATE FULLTEXT INDEX ON table_name (column_name1 […], column_name2 […]) …

  • TYPE COLUMN type_column_name
    指定用來保存 varbinary、varbinary(max) 或 image 文件之文件類型的資料表資料行名稱 (type_column_name)。這個資料行 (稱為類型資料行) 包含使用者提供的副檔名 (.doc、.pdf、.xls 等等)。類型資料行的類型必須是 char、nchar、varchar 或 nvarchar。

    只有當 column_name 指定了將資料儲存為二進位資料的 varbinary、varbinary(max) 或image 資料行,才應指定 TYPE COLUMN type_column_name,否則 SQL Server 會傳回錯誤。

    [!附註]

    建立索引時,全文檢索引擎會使用各資料表資料列之類型資料行中的縮寫,以便識別要為 column_name 中的文件使用哪一種全文檢索搜尋篩選。篩選會將文件載入為二進位資料流、移除格式資訊,並且將文件中的文字傳送到斷詞工具元件。如需詳細資訊,請參閱<全文檢索搜尋篩選>。

  • LANGUAGE language_term
    這是 column_name 中所儲存之資料的語言。

    language_term 是選擇性的,可以指定成對應於語言地區設定識別碼 (LCID) 的字串、整數或十六進位值。如果未指定任何值,就會使用 SQL Server 執行個體的預設語言。

    如果您指定了 language_term,就會利用它代表的語言來建立 char、nchar、varchar、nvarchar、text 和 ntext 資料行中所儲存之資料的索引。這個語言是資料行的全文檢索述詞未指定 language_term 時,在查詢時所用的預設語言。

    當指定為字串時,language_term 會對應至 syslanguages 系統資料表中的 alias 資料行值。字串必須以單引號括住,如 'language_term'。當指定為整數時,language_term 是用於識別語言的實際 LCID。當指定為十六進位值時,language_term 是 0x,後面接著 LCID 的十六進位值。十六進位值不能超出 8 位數,開頭的零也包括在內。

    如果這個值是雙位元組字集 (DBCS) 格式,SQL Server 會將它轉換成 Unicode。

    您必須針對指定為 language_term 的語言來啟用資源,如斷詞工具和字幹分析器。如果這類資源不支援指定的語言,SQL Server 會傳回錯誤。

    請利用 sp_configure 預存程序來存取 MicrosoftSQL Server 執行個體之預設全文檢索語言的相關資訊。如需詳細資訊,請參閱<sp_configure (Transact-SQL)>和<default full-text language 選項>。

    如果是包含多種語言之文字資料的非 BLOB 和非 XML 資料行,或是資料行內所儲存的文字語言不明,您可能適合使用中性 (0x0) 語言資源。但是,您應該先了解使用中性 (0x0) 語言資源的可能結果。如需有關使用中性 (0x0) 語言資源之可能解決方案和結果的詳細資訊,請參閱<建立全文檢索索引時選擇語言的最佳作法>。

    如果是儲存在 XML 或 BLOB 類型資料行中的文件,在建立索引時,將使用文件內的語言編碼。例如在 XML 資料行中,XML 文件的 xml:lang 屬性將會識別語言。在查詢時,除非在全文檢索查詢中指定 language_term,否則,language_term 先前所指定的值會成為全文檢索查詢所用的預設語言。

  • KEY INDEX index_name
    這是 table_name 的唯一索引鍵索引名稱。KEY INDEX 必須是唯一、單索引鍵,且不允許為 Null 的資料行。請選取最小的唯一索引鍵索引來當做全文檢索唯一索引鍵。如需最佳效能,我們建議您針對全文檢索索引鍵使用整數資料類型

  • fulltext_catalog_name
    這是全文檢索索引所用的全文檢索目錄。這個目錄必須已存在於資料庫中。這個子句是選擇性的。如果未指定它,就會使用預設目錄。如果沒有預設目錄,SQL Server 會傳回錯誤。

  • FILEGROUP filegroup_name
    在指定的檔案群組上建立全文檢索索引。此檔案群組必須已存在。如果未指定 FILEGROUP 子句,全文檢索索引會放在與非資料分割資料表之基底資料表或檢視表相同的檔案群組中,或是放在資料分割資料表的主要檔案群組中。

  • CHANGE_TRACKING [ = ] { MANUAL | AUTO | OFF [ , NO POPULATION ] }
    指定全文檢索索引涵蓋的資料表資料行變更 (更新、刪除或插入),是否會由 SQL Server 傳播到全文檢索索引。WRITETEXT 和 UPDATETEXT 的資料變更並不會反映在全文檢索索引中,而且變更追蹤並不會收取這些變更。

    • MANUAL
      指定必須藉由呼叫 ALTER FULLTEXT INDEX … START UPDATE POPULATION Transact-SQL 陳述式來手動傳播追蹤變更 (「手動母體擴展」(Manual Population))。您可以使用 SQL Server Agent 來定期呼叫這個 Transact-SQL 陳述式。

    • AUTO
      指定在修改基底資料表中的資料時,同時自動傳播追蹤變更 (「自動母體擴展」(Automatic population))。雖然變更會自動傳播,但這些變更可能不會立即反映在全文檢索索引中。預設值是 AUTO。

    • OFF [ , NO POPULATION]
      指定 SQL Server 不保留索引資料的變更清單。未指定 NO POPULATION 時,SQL Server 會在建立好索引之後完整擴展索引。

      只有在 CHANGE_TRACKING 是 OFF 時,才能使用 NO POPULATION 選項。當指定 NO POPULATION 時,SQL Server 在建立好索引之後並不會擴展索引。只有當使用者執行含有 START FULL POPULATION 或 START INCREMENTAL POPULATION 子句的 ALTER FULLTEXT INDEX 命令之後,才會擴展索引。

  • STOPLIST [ = ] { OFF | SYSTEM | stoplist_name }
    將全文檢索停用字詞表與索引產生關聯。此索引不會填入屬於指定之停用字詞表一部分的任何 Token。如果未指定 STOPLIST,SQL Server 會將系統全文檢索停用字詞表與此索引產生關聯。

    • OFF
      指定沒有任何停用字詞表要與全文檢索索引產生關聯。

    • SYSTEM
      指定預設全文檢索系統 STOPLIST 應該用於這個全文檢索索引。

    • stoplist_name
      指定要與全文檢索索引產生關聯的停用字詞表名稱。

備註

如需有關全文檢索索引的詳細資訊,請參閱<設定資料庫的全文檢索目錄和索引>。

您可以在 xml 資料行上建立全文檢索索引,以便檢索 XML 元素的內容,但忽略 XML 標記。屬性值是全文檢索索引的值 (除非它們是數值)。元素標記會當做 Token 界限來使用。包含多重語言、格式正確的 XML 或 HTML 文件和片段都受到支援。如需詳細資訊,請參閱<XML 資料行上的全文檢索索引>。

建議索引鍵資料行最好是整數資料類型,這樣會在查詢執行時提供最佳化。

變更追蹤與 NO POPULATION 參數之間的互動

全文檢索索引是否會擴展,將取決於是否啟用變更追蹤及是否在 ALTER FULLTEXT INDEX 陳述式中指定 WITH NO POPULATION 而定。下表摘要列出其互動的結果。

變更追蹤

WITH NO POPULATION

結果

未啟用

未指定

在索引上執行完整母體擴展。

未啟用

已指定

要等到發出 ALTER FULLTEXT INDEX...START POPULATION 陳述式之後,才會進行索引的母體擴展。

已啟用

已指定

引發錯誤,而且索引不會改變。

已啟用

未指定

在索引上執行完整母體擴展。

如需有關擴展全文檢索索引的詳細資訊,請參閱<全文檢索索引母體擴展>。

權限

使用者必須有全文檢索目錄的 REFERENCES 權限,並具有資料表或索引檢視表的 ALTER 權限,或者是系統管理員 (sysadmin) 固定伺服器角色的成員,或是 db_owner 或 db_ddladmin 固定資料庫角色的成員。

如果指定了 SET STOPLIST,使用者在指定的停用字詞表上必須具有 REFERENCES 權限。STOPLIST 的擁有者可以授與這個權限。

[!附註]

一般使用者會被授與 SQL Server 所隨附之預設停用字詞表的 REFERENCE 權限。

範例

A. 建立唯一索引、全文檢索目錄及全文檢索索引

下列範例會針對 AdventureWorks 範例資料庫中 HumanResources.JobCandidate 資料表上的 JobCandidateID 資料行建立唯一索引。然後此範例會建立預設全文檢索目錄 ft。最後,此範例會使用 ft 目錄和系統停用字詞表,針對 Resume 資料行建立全文檢索索引。

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 STOPLIST = SYSTEM;
GO

B. 在數個資料表資料行上建立全文檢索索引

下列範例會針對 AdventureWorks 範例資料庫中 Production.ProductReview 資料表的 ReviewerName、EmailAddress 和 Comments 資料行建立全文檢索索引。此範例會針對每一個資料行指定英文的 LCID 1033,這是資料行中資料的語言。這個全文檢索索引會使用預設的全文檢索目錄及現有的唯一索引鍵索引 PK_ProductReview_ProductReviewID。建議這個索引鍵索引最好位於整數資料行 ProductReviewID 上。

USE AdventureWorks;
GO
CREATE FULLTEXT INDEX ON Production.ProductReview
( 
  ReviewerName
     Language 1033,
  EmailAddress
     Language 1033,
  Comments 
     Language 1033     
 ) 
KEY INDEX PK_ProductReview_ProductReviewID ; 
GO

C. 建立全文檢索索引但不執行擴展

下列範例會在 AdventureWorks 範例資料庫中建立全文檢索目錄 documents_catalog。然後此範例會建立使用這個新目錄的全文檢索索引。全文檢索索引位於 Production.Document 資料表的 Document 資料行上。此範例會指定英文的 LCID 1033,這是資料行中資料的語言。這個全文檢索索引會使用預設的全文檢索目錄及現有的唯一索引鍵索引 PK_Document_DocumentID。建議這個索引鍵索引最好位於整數資料行 DocumentID 上。此範例指定關閉變更追蹤,而且無擴展。之後在離峰時段,此範例會使用 ALTER FULLTEXT INDEX 陳述式,針對新的索引開始完整母體擴展,並啟用自動變更追蹤。

USE AdventureWorks;
GO
CREATE FULLTEXT CATALOG documents_catalog;
GO
CREATE FULLTEXT INDEX ON Production.Document
( Document 
    TYPE COLUMN FileExtension
    Language 1033 )
   KEY INDEX PK_Document_DocumentID
      ON documents_catalog
      WITH CHANGE_TRACKING OFF, NO POPULATION;
   GO

-- 之後在離峰時段擴展索引:

ALTER FULLTEXT INDEX ON Production.Document SET CHANGE_TRACKING AUTO;
GO

變更記錄

更新的內容

在「範例」一節新增其他範例。

新增「變更追蹤與 NO POPULATION 參數之間的互動」一節。