默认情况下,SQL Server 中的数据库已启用全文搜索。 但是,若要对表使用全文索引,必须在要使用 Full-Text 引擎访问的表列上设置全文索引功能。
配置数据库用于 Full-Text 搜索
对于任何方案,数据库管理员执行以下基本步骤,在数据库中配置表列进行全文搜索:
创建全文目录。
在要搜索的每个表上,通过以下方式创建全文索引:
识别您希望包含在全文索引中的每个文本列。
如果给定列包含存储为二进制数据(
varbinary(max)或image数据)的文档,则必须指定一个表列( 类型列),该列标识要编制索引的列中每个文档的类型。指定要对列中的文档使用全文搜索的语言。
选择要在全文索引上使用的更改跟踪机制,以跟踪基表及其列中的更改。
全文搜索通过使用以下 语言组件支持多种语言:断词器和词干程序、包含停用词(也称为噪音词)的停用词表,以及同义词库文件。 同义词库文件以及在某些情况下,停止词表需要由数据库管理员进行配置。 给定的同义词库文件支持所有使用相应语言的全文索引,而给定的停用词表可以与任意数量的全文索引相关联。
设置 Full-Text 目录和索引
这涉及以下基本步骤:
创建全文目录以存储全文索引。
每个全文索引都必须属于全文目录。 可以为每个全文索引创建单独的文本目录,也可以将多个全文索引与给定目录相关联。 全文目录是虚拟对象,不属于任何文件组。 目录是引用一组全文索引的逻辑概念。
在表或索引视图上创建全文索引。
全文索引是一种特殊的基于令牌的功能索引,由 Full-Text 引擎生成和维护。 若要对表或视图创建全文搜索,它必须具有唯一的单列不可为 null 的索引。 Full-Text 引擎要求此唯一索引将表中的每一行映射到唯一的可压缩键。 全文索引可以包括
char、varchar、nchar、nvarchar、text、ntext、image、xml、varbinary和varbinary(max)列。 有关详细信息,请参阅 创建和管理 Full-Text 索引。
在了解如何创建全文索引之前,请务必考虑它们与常规 SQL Server 索引有何不同。 下表列出了差异。
| 全文索引 | 常规 SQL Server 索引 |
|---|---|
| 每个表只允许一个全文索引。 | 每个表允许多个常规索引。 |
| 可以通过计划或特定请求要求添加数据到全文索引(称为填充过程),或者在添加新数据时自动进行。 | 在插入、更新或删除它们所基于的数据时自动更新。 |
| 在同一数据库中分组为一个或多个全文目录。 | 未分组。 |
为 Full-Text 索引选择选项
本部分介绍以下内容:
选择列语言
为全文索引选择文件组
将全文索引分配给全文目录
将停用词表与全文索引相关联
更新全文索引
选择列语言
有关选择列语言时要考虑的事项的信息,请参阅 创建 Full-Text 索引时选择语言。
为 Full-Text 索引选择文件组
生成全文索引的过程,相当耗费I/O资源(从总体上来说,它包括从 SQL Server 读取数据,然后将筛选后的数据写入全文索引)。 最佳做法是在数据库文件组中找到一个全文索引,该索引最适合最大化 I/O 性能,或者在另一卷上的其他文件组中查找全文索引。
如果您注重管理的方便性,建议将表数据和任何相关全文目录存储在同一文件组中。 有时,出于性能原因,你可能希望在存储在不同卷上的不同文件组中具有表数据和全文索引,以最大化 I/O 并行度。
将 Full-Text 索引分配给 Full-Text 目录
规划在全文目录中放置表格的全文索引是很重要的。
建议将具有相同更新特征的表格(例如,少量更改与大量更改,或者在特定时间段内频繁变更的表格)关联在同一个全文目录下。 通过设置全文目录填充计划,全文索引与表保持同步,而不会对数据库服务器在高数据库活动期间的资源使用情况产生不利影响。
将表分配到全文目录时,请考虑以下指导原则:
始终选择可用于全文唯一键的最小唯一索引。 (基于整数的 4 字节索引是最佳索引。这会显著减少文件系统中Microsoft搜索服务所需的资源。 如果主键较大(超过 100 字节),请考虑选择表中的另一个唯一索引(或创建另一个唯一索引)作为全文唯一键。 否则,如果全文唯一键的大小超过允许的最大值(900字节),则全文索引填充将无法继续。
如果要为具有数百万行的表编制索引,请将该表分配给其自己的全文目录。
考虑正在被全文索引的表中的变更数量,以及总行数。 如果要更改的总行数与最后一个全文填充期间表中存在的行数加起来达到数百万行,则将该表分配给其自己的全文目录。
将停止词表与 Full-Text 索引关联
SQL Server 2008 引入了停用词列表。 停用词表是停用词的列表,也称为噪声词。 停用词表与每个全文索引相关联,该停用词表中的单词将应用于该索引的全文查询中。 默认情况下,系统停用词表会与新的全文索引相关联。 但是,你可以改为创建和使用自己的停用词表。 有关详细信息,请参阅 为全文搜索配置和管理非索引字和非索引字表。
例如,以下 CREATE FULLTEXT STOPLISTTransact-SQL 语句通过从系统停用词表复制创建名为 myStoplist3 的新全文停用词表:
CREATE FULLTEXT STOPLIST myStoplist FROM SYSTEM STOPLIST;
GO
以下 ALTER FULLTEXT STOPLISTTransact-SQL 语句将更改名为 myStoplist 的非索引字表,首先添加“en”一词,然后添加西班牙语,然后添加法语:
ALTER FULLTEXT STOPLIST MyStoplist ADD 'en' LANGUAGE 'Spanish';
ALTER FULLTEXT STOPLIST MyStoplist ADD 'en' LANGUAGE 'French';
GO
更新 Full-Text 索引
与常规 SQL Server 索引一样,可以在关联表中修改数据时自动更新全文索引。 这是默认行为。 或者,您可以手动或按指定的计划间隔保留您的全文索引 up-to-date。 填充全文索引可能非常耗时且资源密集型,因此,索引更新通常作为在后台运行的异步进程执行,并在基表中修改后使全文索引保持最新。 在基表中每次更改后立即更新全文索引可能会占用大量资源。 因此,如果更新/插入/删除速率非常高,则查询性能可能会降低。 如果发生这种情况,请考虑安排手动更改跟踪更新,以便不定期地跟上大量更改,而不是与查询争夺系统资源。
若要监控人口状况,请使用 FULLTEXTCATALOGPROPERTY 或 OBJECTPROPERTYEX 函数。 若要获取目录填充状态,请运行以下语句:
SELECT FULLTEXTCATALOGPROPERTY('AdvWksDocFTCat', 'Populatestatus');
通常,如果正在进行全量数据填充,则返回的结果为 1。
示例:设置 Full-Text 搜索
下面的两部分示例创建一个名为 AdventureWorks 数据库的全文目录AdvWksDocFTCat,然后在 AdventureWorks2012 中的表中创建全文索引Document。 此语句在安装期间指定的默认目录中创建全文目录。 命名 AdvWksDocFTCat 的文件夹位于默认目录中。
若要创建一个名为
AdvWksDocFTCat的全文目录,该示例使用 CREATE FULLTEXT CATALOG 语句:USE AdventureWorks; GO CREATE FULLTEXT CATALOG AdvWksDocFTCat;在 Document 表上创建全文索引之前,请确保该表具有唯一且不允许 null 值的单列索引。 以下 CREATE INDEX 语句在 Document 表的 DocumentID 列上创建唯一索引
ui_ukDoc:CREATE UNIQUE INDEX ui_ukDoc ON Production.Document(DocumentID);拥有唯一键后,可以使用以下 CREATE FULLTEXT INDEX 语句对
Document表创建全文索引。CREATE FULLTEXT INDEX ON Production.Document ( Document --Full-text index column name TYPE COLUMN FileExtension --Name of column that contains file type information Language 2057 --2057 is the LCID for British English ) KEY INDEX ui_ukDoc ON AdvWksDocFTCat --Unique index WITH CHANGE_TRACKING AUTO --Population type; GO在此示例中定义的 TYPE COLUMN 指定了表中的类型列,该列包含“Document”列中每一行的文档类型(该列为二进制类型)。 类型列存储用户提供的文件扩展名“.doc”、“.xls”,因此 on-of 给定行中的文档。 Full-Text 引擎使用给定行中的文件扩展名调用正确的筛选器,以分析该行中的数据。 筛选器分析行的二进制数据后,指定的断字符将分析内容(在此示例中,使用英国英语的断字符)。 请注意,筛选过程仅在索引时发生,或者当用户在为全文索引启用自动更改跟踪时插入或更新基表中的列。 有关详细信息,请参阅 “配置和管理搜索筛选器”。
常见任务
创建 Full-Text 目录
查看表或视图的索引
创建唯一索引
创建 Full-Text 索引
查看有关 Full-Text 索引的信息
| 目录或动态管理视图 | DESCRIPTION |
|---|---|
| sys.fulltext_index_catalog_usages(Transact-SQL) | 为每个全文目录与全文索引的引用返回一行。 |
| sys.fulltext_index_columns(Transact-SQL) | 包含作为全文索引一部分的每个列的行。 |
| sys.fulltext_index_fragments(Transact-SQL) | 全文索引使用称为全文索引片段的内部表来存储倒排索引数据。 此视图可用于查询有关这些片段的元数据。 此视图包含包含全文索引的每个表中每个全文索引片段的行。 |
| sys.fulltext_indexes(Transact-SQL) | 每个表格对象的全文索引包含一行。 |
| sys.dm_fts_index_keywords(Transact-SQL) | 返回有关指定表全文索引的内容的信息。 |
| sys.dm_fts_index_keywords_by_document(Transact-SQL) | 返回有关指定表全文索引的文档级内容的信息。 给定关键字可以出现在多个文档中。 |
| sys.dm_fts_index_population(Transact-SQL) | 返回有关当前正在进行的全文索引填充的信息。 |
另请参阅
创建全文本目录 (Transact-SQL)
CREATE FULLTEXT INDEX(Transact-SQL)
CREATE FULLTEXT STOPLIST (Transact-SQL)
CREATE TABLE (Transact-SQL)
填充全文索引
FULLTEXTCATALOGPROPERTY (Transact-SQL)
OBJECTPROPERTYEX (Transact-SQL)