CREATE FULLTEXT INDEX (Transact-SQL)

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

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

Transact-SQL 語法慣例

Syntax

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
 }

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔

引數

table_name

包含全文檢索索引中所含之數據行的數據表或索引檢視表名稱。

column_name

全文檢索索引中包含的數據行名稱。 只有類型為 charvarcharncharnvarchartextntextimagexmlvarbinary(max) 的資料行可針對全文檢索搜尋編製索引。 若要指定多個資料行,請重複 column_name 子句,如下所示:

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

TYPE COLUMN type_column_name

指定數據表數據行的名稱,type_column_name,用來保存 varbinary(max)影像檔的檔案類型。 這個資料行 (稱為類型資料行) 包含使用者提供的副檔名 (.doc、.pdf、.xls 等等)。 類型資料行必須屬於下列類型: char, nchar, varcharnvarchar

只有當 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、ncharvarchar、nvarchartextntext資料行中的索引。 如果未 針對數據行指定為全文檢索述詞的一部分 language_term, 則此語言是查詢時間使用的默認語言。

當指定為字串時, language_term 會對應至系統數據表中的 sys.syslanguages 別名數據行值。 字串必須以單引號括住,如 'language_term'。 當指定為整數時,language_term 是用於識別語言的實際 LCID。 當指定為十六進位值時,language_term0x後面接著 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:lang XML 檔中的屬性會識別語言。 在查詢時,除非在全文檢索查詢中指定 language_term否則,language_term 先前所指定的值會成為全文檢索查詢所用的預設語言。

STATISTICAL_SEMANTICS

適用於:SQL Server (SQL Server 2012 (11.x) 和更新版本)

建立其他關鍵片語以及屬於統計語意索引一部分的文件相似度索引。 如需詳細資訊,請參閱語意搜尋 (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

    指定追蹤的變更會在基表中修改數據時自動傳播(自動母體擴展)。 雖然變更會自動傳播,但這些變更可能不會立即反映在全文檢索索引中。 預設值是 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 }

將全文檢索停用字詞表與索引產生關聯。 索引不會填入屬於指定停用字詞表一部分的任何令牌。 如果未指定 STOPLIST,SQL Server 會將系統全文檢索停用字詞表與索引產生關聯。

  • OFF

    指定沒有與全文檢索索引相關聯的停用字詞表。

  • 系統

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

  • stoplist_name

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

SEARCH PROPERTY LIST [ = ] property_list_name

適用於:SQL Server (SQL Server 2012 (11.x) 和更新版本)

將搜尋屬性清單與索引產生關聯。

  • OFF

    指定沒有屬性清單與全文檢索索引相關聯。

  • property_list_name

    指定要與全文檢索索引產生關聯的搜尋屬性清單名稱。

備註

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

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

CREATE FULLTEXT INDEX 不能放在使用者交易內。 此語句必須在它自己的隱含交易中執行。

如需全文檢索索引的詳細資訊,請參閱建立及管理全文檢索索引

變更追蹤和 NO POPULATION 參數的互動

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

變更追蹤 WITH NO POPULATION 結果
未啟用 未指定 在索引上執行完整母體擴展。
未啟用 已指定 要等到發出 ALTER FULLTEXT INDEX...START POPULATION 陳述式之後,才會進行索引的母體擴展。
啟用 已指定 引發錯誤,而且不會改變索引。
啟用 未指定 在索引上執行完整母體擴展。

如需填入全文檢索索引的詳細資訊,請參閱填入全文檢索索引

權限

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

若已指定 SET STOPLIST,則使用者必須有所指定停用字詞表上的 REFERENCES 權限。 STOPLIST 的擁有者可以授與這個權限。

注意

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

範例

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

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

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. 在數個數據表數據行上建立全文檢索索引

下列範例會在 production_catalog 範例資料庫中建立全文檢索目錄 AdventureWorks。 接著,此範例會建立使用這個新目錄的全文檢索索引。 全文檢索索引位於的、 與資料列上ReviewerNameProduction.ProductReviewCommentsEmailAddress 此範例會針對每一個資料行指定英文的 LCID 1033,這是資料行中資料的語言。 這個全文檢索索引會使用現有的唯一索引鍵索引 PK_ProductReview_ProductReviewID。 建議這個索引鍵位於整數資料行 ProductReviewID 上。

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. 使用搜尋屬性清單建立全文檢索索引,而不填入

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

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

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

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

另請參閱