ALTER FULLTEXT INDEX (Transact-SQL)

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

在 SQL Server 中變更全文檢索索引的屬性。

Transact-SQL 語法慣例

Syntax

ALTER FULLTEXT INDEX ON table_name
   { ENABLE
   | DISABLE
   | SET CHANGE_TRACKING [ = ] { MANUAL | AUTO | OFF }
   | ADD ( column_name
           [ TYPE COLUMN type_column_name ]
           [ LANGUAGE language_term ]
           [ STATISTICAL_SEMANTICS ]
           [ , ...n ]
         )
     [ WITH NO POPULATION ]
   | ALTER COLUMN column_name
     { ADD | DROP } STATISTICAL_SEMANTICS
     [ WITH NO POPULATION ]
   | DROP ( column_name [ , ...n ] )
     [ WITH NO POPULATION ]
   | START { FULL | INCREMENTAL | UPDATE } POPULATION
   | { STOP | PAUSE | RESUME } POPULATION
   | SET STOPLIST [ = ] { OFF | SYSTEM | stoplist_name }
     [ WITH NO POPULATION ]
   | SET SEARCH PROPERTY LIST [ = ] { OFF | property_list_name }
     [ WITH NO POPULATION ]
   }
[ ; ]

注意

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

引數

table_name

包含全文檢索索引中所含之數據行的數據表或索引檢視表名稱。 資料庫和資料表擁有者名稱的指定是選擇性的。

ENABLE | DISABLE

告知 SQL Server 是否要收集 table_name 的全文檢索索引資料。 ENABLE 會啟動全文檢索索引;DISABLE 會關閉全文檢索索引。 停用索引時,數據表不支援全文檢索查詢。

停用全文檢索索引可讓您關閉變更追蹤,但保留全文檢索索引,而且您可以隨時使用 ENABLE 來重新啟動。 停用全文檢索索引時,全文檢索索引中繼資料會保留在系統資料表中。 如果停用全文檢索索引時,CHANGE_TRACKING處於啟用狀態(自動或手動更新),索引的狀態會凍結、任何進行中的編目停止,而且不會追蹤或傳播至索引數據表數據的新變更。

SET CHANGE_TRACKING { MANUAL |AUTO |OFF }

指定全文檢索索引涵蓋的資料表資料行變更 (更新、刪除或插入),是否會由 SQL Server 傳播到全文檢索索引。 透過 WRITETEXT 和 UPDATETEXT 的數據變更不會反映在全文檢索索引中,也不會挑選變更追蹤。

注意

如需詳細資訊,請參閱變更追蹤與 NO POPULATION 參數之間的互動

  • MANUAL

    指定藉由呼叫 ALTER FULLTEXT INDEX ... 來手動傳播追蹤的變更...START UPDATE POPULATION Transact-SQL 語句 (手動母體擴展)。 您可以使用 SQL Server Agent 來定期呼叫這個 Transact-SQL 陳述式。

  • AUTO

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

  • OFF

    指定 SQL Server 不會保留索引資料的變更清單。

ADD | DROP column_name

指定要在全文檢索索引中新增或刪除的資料行。 資料行必須屬於以下類型:charvarcharncharnvarchartextntextimagexmlvarbinary,或 varbinary(max)

請只在先前已啟用了全文檢索索引的資料行上,使用 DROP 子句。

使用 TYPE COLUMN 和 LANGUAGE 來搭配 ADD 子句,在 column_name 上設定這些屬性。 當新增資料行時,您必須重新擴展資料表的全文檢索索引,針對這個資料行的全文檢索查詢才能運作。

注意

全文檢索索引是要在加入資料行之後擴展還是從全文檢索索引卸除,將取決於是否啟用變更追蹤及是否指定 WITH NO POPULATION 而定。 如需詳細資訊,請參閱變更追蹤與 NO POPULATION 參數之間的互動

TYPE COLUMN type_column_name

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

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

注意

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

LANGUAGE language_term

儲存在 column_name 中的數據語言。

language_term 為選擇性,可以指定成對應於語言地區設定識別碼 (LCID) 的字串、整數或十六進位值。 如果指定 language_term,系統就會將它所代表的語言套用至搜尋條件的所有元素上。 如果未指定任何值,就會使用 SQL Server 執行個體的預設全文檢索語言。

sp_configure使用預存程式來存取 SQL Server 實例預設全文檢索語言的相關信息。

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

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

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

如果是包含多種語言之文字資料的非 BLOB 和非 XML 資料行,或資料行所儲存的文字語言不明,請使用中性 (0x0) 語言資源。 對於儲存在 XML 或 BLOB 類型資料行中的文件,檔內的語言編碼會在編製索引時使用。 例如,在 XML 資料行中, xml:lang XML 檔中的屬性會識別語言。 在查詢時,除非在全文檢索查詢中指定 language_term否則,language_term 先前所指定的值會成為全文檢索查詢所用的預設語言。

STATISTICAL_SEMANTICS

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

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

[ , ...n ]

指出 ADD、ALTER 或 DROP 子句可以指定多個資料行。 當指定多個資料行時,請用逗號來分開這些資料行。

WITH NO POPULATION

指定在 ADD 或 DROP 資料行作業或 SET STOPLIST 作業之後,將不會填入全文檢索索引。 只有在使用者執行 START... 時,才會填入索引...POPULATION 命令。

指定NO POPULATION時,SQL Server 不會填入索引。 只有在使用者提供了 ALTER FULLTEXT INDEX...START POPULATION 命令之後,才會擴展索引。 未指定 NO POPULATION 時,SQL Server 會填入索引。

如果既啟用 CHANGE_TRACKING,又指定 WITH NO POPULATION,SQL Server 會傳回錯誤。 如果啟用CHANGE_TRACKING且未指定WITH NO POPULATION,SQL Server 會在索引上執行完整母體擴展。

注意

如需詳細資訊,請參閱變更追蹤與 NO POPULATION 參數之間的互動

{ADD | DROP } STATISTICAL_SEMANTICS

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

啟用或停用指定之資料行的統計語意索引。 如需詳細資訊,請參閱語意搜尋 (SQL Server)

START { FULL |INCREMENTAL |UPDATE } POPULATION

通知 SQL Server 來開始擴展 table_name 的全文檢索索引。 如果全文檢索索引母體擴展正在進行中,SQL Server 會傳回警告,而且不會啟動新的母體擴展。

  • FULL

    指定即使數據列已經編製索引,也會針對全文檢索索引擷取數據表的每個數據列。

  • INCREMENTAL

    指定只擷取自上次母體索引編製後修改的數據列。 資料表必須有 timestamp類型的資料行,INCREMENTAL 才適用。 如果全文檢索目錄中的數據表未包含類型 時間戳的數據行,數據表就會進行 FULL 母體擴展。

  • UPDATE

    指定處理上次更新變更追蹤索引之後的所有插入、更新或刪除。 變更追蹤母體必須在數據表上啟用,但不應該開啟背景更新索引或自動變更追蹤。

{STOP | PAUSE | RESUME } POPULATION

停止或暫停任何進行中的擴展動作,或是停止或繼續任何已暫停的擴展動作。

STOP POPULATION 不會停止自動變更追蹤或背景更新索引。 若要停止變更追蹤,請使用 SET CHANGE_TRACKING OFF。

PAUSE POPULATION 和 RESUME POPULATION 只適用於完全擴展。 它們與其他母體類型無關,因為其他母體會從搜耙停止的位置繼續編目。

SET STOPLIST { OFF |SYSTEM | stoplist_name }

變更與此索引相關聯的全文檢索停用字詞表 (如果有的話)。

  • OFF

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

  • 系統

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

  • stoplist_name

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

如需詳細資訊,請參閱 設定及管理全文檢索搜尋的停用字詞與停用字詞表

SET SEARCH PROPERTY LIST { OFF | property_list_name } [ WITH NO POPULATION ]

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

變更與此索引相關聯的搜尋屬性清單 (如果有的話)。

  • OFF

    指定沒有屬性清單與全文檢索索引相關聯。 當您關閉全文檢索索引的搜尋屬性清單時,ALTER FULLTEXT INDEX ... SET SEARCH PROPERTY LIST OFF就無法再搜尋基表上的屬性。

    根據預設,當您關閉現有的搜尋屬性清單時,會自動重新擴展全文檢索索引。 如果您在關閉搜尋屬性清單時指定 WITH NO POPULATION,則不會自動重新填入。 不過,我們建議您在方便時最終要在這個全文檢索索引執行完整母體擴展。 重新擴展全文檢索索引,會移除每個已卸除之搜尋屬性的屬性特定中繼資料,讓全文檢索索引變得更小、更有效率。

  • property_list_name

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

    若要將搜尋屬性清單加入至全文檢索索引,需要重新擴展索引,以檢索已註冊用於相關聯搜尋屬性清單的搜尋屬性。 如果您在新增搜尋屬性清單時指定 WITH NO POPULATION,則必須在適當的時間在索引上執行母體擴展。

重要

如果全文檢索索引先前與不同的搜尋相關聯,索引必須重建屬性清單,以便讓索引處於一致狀態。 系統會立即截斷並清空索引,直到完整母體擴展執行為止。 如需詳細資訊,請參閱變更搜尋屬性清單導致重建索引

注意

您可以將特定的搜尋屬性清單與相同資料庫中的多個全文檢索索引相關聯。

尋找目前資料庫的搜尋屬性清單

如需搜尋屬性清單的詳細資訊,請參閱使用搜尋屬性清單搜尋文件屬性

備註

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

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

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

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

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

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

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

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

變更搜尋屬性清單會導致重建索引

第一次全文檢索索引與搜尋屬性清單相關聯時,索引必須重新擴展,以檢索屬性特定的搜尋詞彙。 不會截斷現有的索引數據。

但是,如果您將全文檢索索引與不同的屬性清單產生關聯,則會重建索引。 重建會立即截斷全文檢索索引,移除所有現有的資料,而且必須重新擴展索引。 當母體擴展進行時,基底資料表上的全文檢索查詢只會在已由母體擴展編製索引的資料表資料列上進行搜尋。 重新填入的索引數據報含新加入搜尋屬性清單之已註冊屬性的元數據。

導致重建的狀況包括:

  • 直接切換至不同的搜尋屬性清單(請參閱本節稍後的<案例 a="">)。

  • 關閉搜尋屬性清單,稍後將索引與任何搜尋屬性清單產生關聯(請參閱本節稍後的<案例 b="">)。

注意

如需全文檢索搜尋使用搜尋屬性清單之運作方式的詳細資訊,請參閱使用搜尋屬性清單搜尋文件屬性。 如需完整母體擴展的資訊,請參閱填入全文檢索索引

案例 A:直接切換至不同的搜尋屬性清單

  1. table_1 上,建立具有搜尋屬性清單 spl_1 的全文檢索索引:

    CREATE FULLTEXT INDEX ON table_1 (column_name) KEY INDEX unique_key_index
        WITH SEARCH PROPERTY LIST=spl_1,
        CHANGE_TRACKING OFF, NO POPULATION;
    
  2. 在全文檢索索引上執行完整母體擴展:

    ALTER FULLTEXT INDEX ON table_1 START FULL POPULATION;
    
  3. 稍後使用下列陳述式,將全文檢索索引與不同的搜尋屬性清單 spl_2 產生關聯:

    ALTER FULLTEXT INDEX ON table_1 SET SEARCH PROPERTY LIST spl_2;
    

    此陳述式會導致完整母體擴展 (預設行為)。 但在此母體擴展開始之前,Full-Text Engine 會自動截斷索引。

案例 B:關閉搜尋屬性清單,稍後將索引與任何搜尋屬性清單產生關聯

  1. table_1 上,建立具有搜尋屬性清單 spl_1 的全文檢索索引,接著執行自動的完整母體擴展 (預設行為):

    CREATE FULLTEXT INDEX ON table_1 (column_name) KEY INDEX unique_key_index
        WITH SEARCH PROPERTY LIST=spl_1;
    
  2. 關閉搜尋屬性清單,如下所示:

    ALTER FULLTEXT INDEX ON table_1
        SET SEARCH PROPERTY LIST OFF WITH NO POPULATION;
    
  3. 再次將全文檢索索引與相同搜尋屬性清單或另一個搜尋屬性清單產生關聯。

    例如,下列語句會將全文檢索索引與原始搜尋屬性清單建立關聯: spl_1

    ALTER FULLTEXT INDEX ON table_1 SET SEARCH PROPERTY LIST spl_1;
    

    此陳述式會啟動完整母體擴展 (預設行為)。

    注意

    針對不同的搜尋屬性清單 (例如 spl_2),也需要進行重建。

權限

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

如果指定了 SET STOPLIST,使用者在停用字詞表上必須具有 REFERENCES 權限。 如果指定了 SET SEARCH PROPERTY LIST,使用者必須有搜尋屬性清單的 REFERENCES 權限。 如果指定之停用字詞表或搜尋屬性清單的擁有者有 ALTER FULLTEXT CATALOG 權限,該擁有者可以授與 REFERENCES 權限。

注意

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

範例

A. 設定手動變更追蹤

下列範例會針對 JobCandidate 資料表設定全文檢索索引的手動變更追蹤。

USE AdventureWorks2022;
GO
ALTER FULLTEXT INDEX ON HumanResources.JobCandidate
   SET CHANGE_TRACKING MANUAL;
GO

B. 建立屬性清單與全文檢索索引的關聯

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

下列範例會將 DocumentPropertyList 屬性清單與 Production.Document 資料表的全文檢索索引產生關聯。 這個 ALTER FULLTEXT INDEX 陳述式會啟動完整母體擴展,這是 SET SEARCH PROPERTY LIST 子句的預設行為。

注意

如需建立 DocumentPropertyList 屬性清單的範例,請參閱 CREATE SEARCH PROPERTY LIST (Transact-SQL)

USE AdventureWorks2022;
GO
ALTER FULLTEXT INDEX ON Production.Document
   SET SEARCH PROPERTY LIST DocumentPropertyList;
GO

C. 拿掉搜尋屬性清單

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

下列範例會從 DocumentPropertyList 的全文檢索索引移除 Production.Document 屬性清單。 在此範例中,不會急於從索引中移除屬性,因此會指定WITH NO POPULATION 選項。 但是,不再允許對這個全文檢索索引進行屬性層級搜尋。

USE AdventureWorks2022;
GO
ALTER FULLTEXT INDEX ON Production.Document
   SET SEARCH PROPERTY LIST OFF WITH NO POPULATION;
GO

D. 啟動完整母體擴展

下列範例會針對 JobCandidate 資料表啟動全文檢索索引的完整母體擴展。

USE AdventureWorks2022;
GO
ALTER FULLTEXT INDEX ON HumanResources.JobCandidate
   START FULL POPULATION;
GO

另請參閱