创建和维护全文索引涉及使用称为 填充 (也称为 爬网)的进程填充索引。
人口类型
SQL Server 支持以下类型的填充:完全填充、基于跟踪的自动填充或手动填充,以及基于时间戳的增量填充。
全部人口
在完全填充期间,将为表或索引视图的所有行生成索引条目。 全文索引的完整填充,为基表或索引视图的所有行生成索引项。
默认情况下,SQL Server 在创建后立即完全填充新的全文索引。 然而,全部人口可能会消耗大量资源。 因此,在高峰期创建全文索引时,通常最佳做法是将完整填充延迟到非高峰时间,尤其是在全文索引基表较大时。 但是,索引所属的全文目录在填充其所有全文索引之前不可使用。 若要在不立即将其填充的情况下创建全文索引,请在 CREATE FULLTEXT INDEX 语句中指定 CHANGE_TRACKING OFF、NO POPULATION 子句。 如果指定CHANGE_TRACKING MANUAL,则 Full-Text 引擎使用语句。 除非使用 START FULL POPULATION 或 START INCREMENTAL POPULATION 子句执行 ALTER FULLTEXT INDEX 语句,否则 SQL Server 不会填充新的全文索引。 有关详细信息,请参阅示例“A. 创建不运行完整数据填充的全文索引”和“B”。 在表上执行完整填充,详细内容在本主题的后面部分。
更改 Tracking-Based 总体
你可以选择在全文索引初次完全填充之后,使用更改跟踪来维护该索引。 与更改跟踪相关的开销很小,因为 SQL Server 会维护一个表,该表跟踪自上次填充以来对基表的更改。 使用更改跟踪时,SQL Server 会保留基表或索引视图中已由更新、删除或插入修改的行的记录。 通过 WRITETEXT 和 UPDATETEXT 进行的数据更改不会反映在全文索引中,也不会被更改跟踪检测到。
注释
对于包含 timestamp 列的表,可以使用增量填充。
在创建索引期间启用更改跟踪时,SQL Server 将在创建索引后立即完全填充新的全文索引。 此后,将跟踪更改并将其传播到全文索引。 有两种类型的更改跟踪:自动(CHANGE_TRACKING AUTO 选项)和手动(CHANGE_TRACKING MANUAL 选项)。 自动更改跟踪是默认行为。
更改跟踪的类型决定了全文索引的填充方式,如下所示:
- 自动填充数据 - 默认情况下,或者如果指定 CHANGE_TRACKING AUTO,Full-Text 引擎会在全文索引上使用自动填充处理。 初始完整填充完成后,基表中数据修改时会对更改进行追踪,并且这些追踪的更改会自动传播。 但是,全文索引在后台更新,因此传播的更改可能不会立即反映在索引中。 - 使用自动填充设置跟踪更改 - CREATE FULLTEXT INDEX ... 使用更改跟踪自动模式 
- ALTER FULLTEXT INDEX ...SET CHANGE_TRACKING AUTO 
 - 有关详细信息,请参阅示例“E. 在本主题后面,将更改全文索引以使用自动更改跟踪。 
- 手动填充 - 如果指定CHANGE_TRACKING MANUAL,则 Full-Text 引擎在全文索引上使用手动填充。 初始完整填充完成后,当在基表中的数据被修改时,会跟踪更改。 但是,只有在您执行 ALTER FULLTEXT INDEX...START UPDATE POPULATION 语句之后,它们才会传播到全文索引中。 可以使用 SQL Server 代理定期调用此 Transact-SQL 语句。 - 开始使用手动填充跟踪更改 - CREATE FULLTEXT INDEX ...WITH CHANGE_TRACKING MANUAL 
- ALTER FULLTEXT INDEX ...SET CHANGE_TRACKING MANUAL 
 - 有关详细信息,请参阅示例“C. 使用手动更改跟踪和“D”创建全文索引。 运行手动填充,“本主题后面的部分。 
关闭更改跟踪
- CREATE FULLTEXT INDEX ...WITH CHANGE_TRACKING OFF 
- ALTER FULLTEXT INDEX ... 设置更改跟踪为关闭 
增量 Timestamp-Based 群体
增量填充是手动填充全文索引的替代机制。 可以为CHANGE_TRACKING设置为 MANUAL 或 OFF 的全文索引运行增量填充。 如果全文索引上的第一个填充是增量填充,则会为所有行编制索引,使其等效于完整填充。
增量数据填充的要求是索引表必须具有 timestamp 数据类型的列。 如果timestamp列不存在,则无法执行增量填充。 由于表中没有 timestamp 列,对增量填充请求会导致执行完全填充操作。 此外,如果影响表全文索引的任何元数据自上次填充以来发生了更改,增量填充请求将作为完整填充实现。 这包括更改任何列、索引或全文索引定义导致的元数据更改。
SQL Server 使用 timestamp 列标识自上次填充以来已更改的行。 然后,增量填充会更新上次填充之后添加、删除或修改的行的全文索引,或者上次填充正在进行中时。 如果表遇到大量插入,相比于手动填充,使用增量填充会更高效。
在一个群体结束时,Full-Text 引擎会记录一个新的 timestamp 值。 此值是 SQL 收集器遇到的最大值 timestamp 。 当后续增量填充启动时,将使用此值。
若要执行增量填充,请使用 START INCREMENTAL POPULATION 子句运行 ALTER FULLTEXT INDEX 语句。
填充 Full-Text 索引的示例
注释
本节中的示例使用 Production.Document 或 HumanResources.JobCandidate 表在 AdventureWorks 示例数据库中。
答: 创建全文索引而不执行完整填充
以下示例在AdventureWorks示例数据库的Production.Document表上创建全文索引。 此示例使用 WITH CHANGE_TRACKING OFF 和 NO POPULATION 来延迟初始数据全量填充。
CREATE UNIQUE INDEX ui_ukDoc ON Production.Document(DocumentID);  
CREATE FULLTEXT CATALOG AW_Production_FTCat;  
CREATE FULLTEXT INDEX ON Production.Document  
(  
    Document                         --Full-text index column name   
        TYPE COLUMN FileExtension    --Name of column that contains file type information  
        Language 1033                 --1033 is LCID for the English language  
)  
    KEY INDEX ui_ukDoc  
    ON AW_Production_FTCat  
    WITH CHANGE_TRACKING OFF, NO POPULATION;  
GO  
  
B. 在表上执行完整填充
以下示例在 AdventureWorks 示例数据库的 Production.Document 表上运行完整填充操作。
ALTER FULLTEXT INDEX ON Production.Document  
   START FULL POPULATION;  
C. 使用手动更改跟踪创建全文索引
以下示例将在AdventureWorks示例数据库的HumanResources.JobCandidate表上创建一个全文索引,该索引将使用更改跟踪并进行手动填充。
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 CHANGE_TRACKING=MANUAL;  
GO  
D. 运行手动数据填充
以下示例在AdventureWorks示例数据库的HumanResources.JobCandidate表的变更跟踪全文索引上运行手动填充。
USE AdventureWorks;  
GO  
ALTER FULLTEXT INDEX ON HumanResources.JobCandidate START UPDATE POPULATION;  
GO  
E. 更改全文索引以使用自动更改跟踪
以下示例将更改示例数据库的AdventureWorks表的HumanResources.JobCandidate全文索引,以使用更改跟踪和自动填充。
USE AdventureWorks;  
GO  
ALTER FULLTEXT INDEX ON HumanResources.JobCandidate SET CHANGE_TRACKING AUTO;  
GO   
创建或更改增量增长的调度
在 Management Studio 中创建或更改增量填充的计划
- 在对象资源管理器中,展开服务器。 
- 展开 数据库,然后展开包含全文索引的数据库。 
- 展开 表。 
右键单击定义全文索引的表,选择 Full-Text 索引,然后在 Full-Text 索引 上下文菜单上单击“ 属性”。 这将打开 “全文索引属性 ”对话框。
- 在 “选择页面 ”窗格中,选择“计划”。 - 使用此页面来创建或管理针对 SQL Server 代理作业的计划,该作业将启动针对基表或全文索引的索引视图的增量表数据填充。 - 重要 - 如果基表或视图不包含 - timestamp数据类型的列,则执行全量填充。- 选项如下所示: - 若要创建新计划,请单击“ 新建”。 - 这将打开 “新建 Full-Text 索引表计划 ”对话框,可在其中创建计划。 若要保存计划,请单击“ 确定”。 - 重要 - SQL Server 代理作业(在database_name.table_name上启动增量表填充)在退出Full-Text 索引属性对话框后与新计划相关联。 如果为全文索引创建多个计划,它们都使用相同的任务。 
- 若要更改计划,请选择它,然后单击“ 编辑”。 - 这将打开 “新建 Full-Text 索引表计划 ”对话框,可在其中修改计划。 - 注释 - 有关修改作业的信息,请参阅 “修改作业”。 
- 若要删除计划,请选择它,然后单击“ 删除”。 
 
- 单击 “确定” 。 
排查 Full-Text 填充中的错误(爬网)
在爬网期间发生错误时,Full-Text 搜索爬网日志记录工具将创建和维护爬网日志,该日志是纯文本文件。 每个爬网日志对应于特定的全文目录。 默认情况下,给定实例的爬网日志(在本例中,第一个实例)位于 %ProgramFiles%\Microsoft SQL Server\MSSQL12。MSSQLSERVER\MSSQL\LOG 文件夹。 爬网日志文件遵循以下命名方案:
SQLFT<DatabaseID><FullTextCatalogID>。LOG[<n>]
<DatabaseID>
数据库的 ID。 
              <
              dbid
              > 是带前导零的五位数。
<FullTextCatalogID>
全文目录 ID。 
              <
              catid
              > 是带前导零的五位数。
<n>
一个整数,指示存在同一全文目录的一个或多个爬网日志。
例如,SQLFT0000500008.2 是数据库 ID 为 5 的数据库的爬网日志文件,全文目录 ID = 8。 文件名末尾的 2 表示此数据库/目录对有两个爬网日志文件。
另请参阅
              sys.dm_fts_index_population(Transact-SQL)
              全文搜索入门
              创建和管理全文索引
              CREATE FULLTEXT INDEX(Transact-SQL)
              ALTER FULLTEXT INDEX (Transact-SQL)