共用方式為


CREATE FULLTEXT INDEX (Transact-SQL)

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

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

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

語法

CREATE FULLTEXT INDEX ON table_name
   [ ( { column_name 
             [ TYPE COLUMN type_column_name ]
             [ LANGUAGE language_term ] 
             [ STATISTICAL_SEMANTICS ]
        } [ ,...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 }
 | SEARCH PROPERTY LIST [ = ] property_list_name 
 }

引數

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

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

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

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

    僅當 column_name 指定要將資料儲存為二進位資料的 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 預存程序來存取 Microsoft SQL Server 執行個體的預設全文檢索語言的相關資訊。 如需詳細資訊,請參閱<sp_configure (Transact-SQL)>。

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

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

  • STATISTICAL_SEMANTICS
    建立其他關鍵片語以及屬於統計語意索引一部分的文件相似度索引。 如需詳細資訊,請參閱<語意搜尋 (SQL Server)>。

  • 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
      指定要與全文檢索索引產生關聯的停用字詞表名稱。

  • SEARCH PROPERTY LIST [ = ] property_list_name
    將搜尋屬性清單與索引產生關聯。

    • OFF
      指定沒有任何屬性清單要與全文檢索索引產生關聯。

    • property_list_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_catalog。 然後此範例會建立使用這個新目錄的全文檢索索引。 全文檢索索引位於 AdventureWorks 範例資料庫 Production.ProductReview 資料表的 ReviewerName、EmailAddress 和 Comments 資料行上。 此範例會針對每一個資料行指定英文的 LCID 1033,這是資料行中資料的語言。 這個全文檢索索引會使用現有的唯一索引鍵索引 PK_ProductReview_ProductReviewID。 建議這個索引鍵索引最好位於整數資料行 ProductReviewID 上。

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

C.建立具有搜尋屬性清單但不加以擴展的全文檢索索引

下列範例會針對 Production.Document 資料表的 Title、DocumentSummary 和 Document 資料行建立全文檢索索引。 此範例會指定英文的 LCID 1033,這是這些資料行中資料的語言。 這個全文檢索索引會使用預設的全文檢索目錄及現有的唯一索引鍵索引 PK_Document_DocumentID。 建議這個索引鍵位於整數資料行 DocumentID 上。

此範例會指定 SYSTEM 停用字詞表。 它也會指定搜尋屬性清單 DocumentPropertyList;如需建立這個屬性清單的範例,請參閱<CREATE SEARCH PROPERTY LIST (Transact-SQL)>。

此範例指定關閉變更追蹤,而且無擴展。 之後在離峰時段,此範例會使用 ALTER FULLTEXT INDEX 陳述式,針對新的索引開始完整母體擴展,並啟用自動變更追蹤。

USE AdventureWorks;
GO
CREATE FULLTEXT INDEX ON Production.Document
  ( 
  Title
      Language 1033, 
  DocumentSummary
      Language 1033, 
  Document 
      TYPE COLUMN FileExtension
      Language 1033 
  )
  KEY INDEX PK_Document_DocumentID
          WITH STOPLIST = SYSTEM, SEARCH PROPERTY LIST = DocumentPropertyList, CHANGE_TRACKING OFF, NO POPULATION;
   GO

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

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

請參閱

參考

ALTER FULLTEXT INDEX (Transact-SQL)

DROP FULLTEXT INDEX (Transact-SQL)

GRANT (Transact-SQL)

sys.fulltext_indexes (Transact-SQL)

概念

建立及管理全文檢索索引

全文檢索搜尋 (SQL Server)

使用搜索屬性清單搜索文件屬性