介绍如何对包含文档或文本的选定列启用或禁用统计语义索引。
统计语义搜索使用 Full-Text 搜索创建的索引,并创建其他索引。 由于此对全文搜索的依赖关系,在定义新的全文索引或更改现有全文索引时,将创建新的语义索引。 可以使用 Transact-SQL 语句或使用 SQL Server Management Studio 中的 Full-Text 索引向导和其他对话框创建新的语义索引,如本主题中所述。
创建语义索引
创建语义索引的要求和限制
可以对全文索引支持的任何数据库对象(包括表和索引视图)创建索引。
在为特定列启用语义索引之前,必须存在以下先决条件:
数据库必须存在全文目录。
该表必须具有全文索引。
所选列必须参与全文索引。
可以同时创建和启用所有这些要求。
可以对具有任何支持全文索引的数据类型的列创建语义索引。 有关详细信息,请参阅 创建和管理 Full-Text 索引。
可以为
varbinary(max)列指定任何支持全文索引的文档类型。 有关详细信息,请参阅 “如何:确定可在本主题中为哪些文档类型编制索引 ”。语义索引为所选列创建两种类型的索引 - 关键短语索引和文档相似性索引。 启用语义索引时,不能仅选择一种类型的索引。 但是,可以单独查询这两个索引。 有关详细信息,请参阅 使用语义搜索在文档中查找关键短语 ,以及 使用语义搜索查找相似和相关文档。
如果未为语义索引显式指定 LCID,则仅使用主要语言及其关联的语言统计信息进行语义索引。
如果为语言模型不可用的列指定语言,则创建索引会失败并返回错误消息。
如何:在没有 Full-Text 索引时创建语义索引
使用 CREATE FULLTEXT INDEX 语句创建新的全文索引时,可以通过将关键字 STATISTICAL_SEMANTICS 指定为列定义的一部分,在列级别启用语义索引。 使用 Full-Text 索引向导创建新的全文索引时,还可以启用语义索引。
使用 Transact-SQL 创建新的语义索引
调用 CREATE FULLTEXT INDEX 语句,并为要为其创建语义索引的每个列指定 STATISTICAL_SEMANTICS 。 有关此语句的所有选项的详细信息,请参阅 CREATE FULLTEXT INDEX (Transact-SQL)。
示例 1:创建唯一索引、全文索引和语义索引
以下示例创建默认全文目录 ft。 然后,该示例针对 AdventureWorks2012 示例数据库的 HumanResources.JobCandidate 表的 JobCandidateID 列创建唯一索引。 此唯一索引作为全文索引的键列是必需的。 然后,该示例在 “恢复 ”列上创建全文索引和语义索引。
CREATE FULLTEXT CATALOG ft AS DEFAULT
GO
CREATE UNIQUE INDEX ui_ukJobCand
ON HumanResources.JobCandidate(JobCandidateID)
GO
CREATE FULLTEXT INDEX ON HumanResources.JobCandidate
(Resume
Language 1033
Statistical_Semantics
)
KEY INDEX JobCandidateID
WITH STOPLIST = SYSTEM
GO
示例 2:针对具有延迟索引填充的多个列创建全文和语义索引
以下示例在 AdventureWorks2012 示例数据库中创建全文目录 documents_catalog。 然后,该示例创建使用此新目录的全文索引。 全文索引是在 Production.Document 表的 Title、DocumentSummary 和 Document 列上创建的,而语义索引仅在文档列上创建。 此全文索引使用新创建的全文目录和现有的唯一键索引, PK_Document_DocumentID。 建议,此索引键是在整数列 DocumentID 上创建的。 该示例指定英语的 LCID,即 1033,这是列中数据所使用的语言。
此示例还指定更改跟踪处于关闭状态,并且没有数据填充。 稍后,在非高峰时段,该示例使用 ALTER FULLTEXT INDEX 语句在新索引上启动完整填充,并启用自动更改跟踪。
CREATE FULLTEXT CATALOG documents_catalog
GO
CREATE FULLTEXT INDEX ON Production.Document
(
Title
Language 1033,
DocumentSummary
Language 1033,
Document
TYPE COLUMN FileExtension
Language 1033
Statistical_Semantics
)
KEY INDEX PK_Document_DocumentID
ON documents_catalog
WITH CHANGE_TRACKING OFF, NO POPULATION
GO
稍后,在非高峰时间填充索引:
ALTER FULLTEXT INDEX ON Production.Document SET CHANGE_TRACKING AUTO
GO
使用 SQL Server Management Studio 创建新的语义索引
运行 Full-Text 索引向导,并在选择表列页面上,为您希望创建语义索引的每个列启用统计语义。 有关详细信息,包括有关如何启动 Full-Text 索引向导的信息,请参阅 “使用 Full-Text 索引向导”。
如何:在存在现有 Full-Text 索引时创建语义索引
使用 ALTER FULLTEXT INDEX 语句更改现有全文索引时,可以添加语义索引。 还可以使用 SQL Server Management Studio 中的各种对话框添加语义索引。
使用 Transact-SQL 添加语义索引
对要添加语义索引的每个列调用 ALTER FULLTEXT INDEX 语句,其中包含下面所述的选项。 有关此语句的所有选项的详细信息,请参阅 ALTER FULLTEXT INDEX (Transact-SQL)。
全文索引和语义索引在调用 ALTER 后重新填充,除非另有指定。
若要仅向列添加全文索引,请使用 ADD 语法。
若要将全文索引和语义索引添加到列,请将 ADD 语法与 STATISTICAL_SEMANTICS 选项一起使用。
若要将语义索引添加到已为全文索引启用的列,请使用 ADD STATISTICAL_SEMANTICS 选项。 只能将语义索引添加到单个 ALTER 语句中的一列。
示例:向已具有全文索引的列添加语义索引
以下示例更改 AdventureWorks2012 示例数据库中 Production.Document 表的现有全文索引。 本示例在 Production.Document 表的 Document 列上添加语义索引,该列已具有全文索引。 该示例指定不会自动重新填充索引。
ALTER FULLTEXT INDEX ON Production.Document
ALTER COLUMN Document
ADD Statistical_Semantics
WITH NO POPULATION
GO
使用 SQL Server Management Studio 添加语义索引
您可以在Full-Text“索引属性”对话框的Full-Text“索引列”页中更改启用语义和全文索引的列。 有关详细信息,请参阅 “管理 Full-Text 索引”。
更改现有索引的要求和限制
在索引填充正在进行时,不能更改现有索引。 有关监视索引填充进度的详细信息,请参阅 “管理和监视语义搜索”。
不能在对 ALTER FULLTEXT INDEX 语句的单个调用中向列添加索引,也不能更改或删除同一列的索引。
删除语义索引
如何:删除语义索引
使用 ALTER FULLTEXT INDEX 语句更改现有全文索引时,可以删除语义索引。 还可以使用 SQL Server Management Studio 中的各种对话框删除语义索引。
使用 Transact-SQL 删除语义索引
- 若要仅从列或列中删除语义索引,请使用 ALTER COLUMNcolumn_nameDROP STATISTICAL_SEMANTICS 选项调用 ALTER FULLTEXT INDEX 语句。 可以在单个 ALTER 语句中从多个列中删除索引。
```sql
USE database_name
GO
ALTER FULLTEXT INDEX
ALTER COLUMN column_name
DROP STATISTICAL_SEMANTICS
GO
```
若要从列中删除全文索引和语义索引,请使用 ALTER COLUMNcolumn_nameDROP 选项调用 ALTER FULLTEXT INDEX 语句。
USE database_name GO ALTER FULLTEXT INDEX ALTER COLUMN column_name DROP GO
使用 SQL Server Management Studio 删除语义索引
可以在 Full-Text“索引属性”对话框的 Full-Text“索引列”页面上更改启用语义索引和全文索引的列。 有关详细信息,请参阅 “管理 Full-Text 索引”。
删除语义索引的要求和限制
在保留语义索引时,无法从列中删除全文索引。 语义索引取决于文档相似性结果的全文索引。
当从启用了语义索引的表中的最后一列删除语义索引时,不能指定 NO POPULATION 选项。 需要一个人口周期来移除之前编制索引的结果。
检查是否在数据库对象上启用语义搜索
如何:检查是否对数据库对象启用了语义搜索
是否为数据库启用了语义搜索?
查询 DATABASEPROPERTYEX (Transact-SQL) 元数据函数的 IsFullTextEnabled 属性。
返回值为 1 表示为数据库启用了全文搜索和语义搜索;返回值 0 表示它们未启用。
SELECT DATABASEPROPERTYEX('database_name', 'IsFullTextEnabled')
GO
是否为表启用了语义搜索?
查询 OBJECTPROPERTYEX (Transact-SQL) 元数据函数的 TableFullTextSemanticExtraction 属性。
返回值为 1 表示为表启用了语义搜索;返回值为 0 表示它未启用。
SELECT OBJECTPROPERTYEX(OBJECT_ID('table_name'), 'TableFullTextSemanticExtraction')
GO
是否为列启用了语义搜索?
若要确定是否为特定列启用了语义搜索,请执行以下作:
查询 COLUMNPROPERTY (Transact-SQL) 元数据函数的 StatisticalSemantics 属性。
返回值为 1 表示为列启用了语义搜索;返回值为 0 表示它未启用。
SELECT COLUMNPROPERTY(OBJECT_ID('table_name'), 'column_name', 'StatisticalSemantics') GO查询目录视图sys.fulltext_index_columns(Transact-SQL)以获取全文索引。
在 statistical_semantics 列中,值为 1 表示指定的列除了全文索引外,还启用了语义索引。
SELECT * FROM sys.fulltext_index_columns WHERE object_id = OBJECT_ID('table_name') GO在 Management Studio 中的对象资源管理器中,右键单击列并选择“ 属性”。 在“列属性”对话框的“常规”页上,选中统计语义属性的值。
如果值为 True,则表示除了启用全文索引外,还为指定的列启用了语义索引。
确定可为语义搜索编制索引的内容
如何:检查语义搜索支持的语言
重要
语义索引支持的语言比全文索引少。 因此,可能有列可以索引进行全文搜索,但不能用于语义搜索。
查询目录视图sys.fulltext_semantic_languages (Transact-SQL)。
SELECT * FROM sys.fulltext_semantic_languages
GO
语义索引支持以下语言。 此列表表示按 LCID 排序的目录视图 sys.fulltext_semantic_languages(Transact-SQL)的输出。
| 语言 | LCID |
|---|---|
| 德语 | 1031 |
| 英语(美式) | 1033 |
| 法语 | 1036 |
| 意大利语 | 1040 |
| 葡萄牙语(巴西) | 1046 |
| 俄语 | 1049 |
| 瑞典语 | 1053 |
| 英语(英国) | 2057 |
| 葡萄牙语(葡萄牙) | 2070 |
| 西班牙语 | 3082 |
如何:确定可对哪些文档类型编制索引
查询目录视图 sys.fulltext_document_types (Transact-SQL)。
如果要编制索引的文档类型不在受支持的类型列表中,则可能需要查找、下载和安装其他筛选器。 有关详细信息,请参阅“查看或更改已注册的筛选器和断字工具”。
最佳做法:考虑为 Full-Text 和语义索引创建单独的文件组
如果磁盘空间分配令人担忧,请考虑为全文索引和语义索引创建单独的文件组。 语义索引是在与全文索引相同的文件组中创建的。 完全填充的语义索引可能包含大量数据。
问题:搜索特定列不返回任何结果
是否为 Unicode 语言指定了非 Unicode LCID?
可以对非 Unicode 字符列类型启用语义索引,同时使用适用于只有 Unicode 单词的语言的 LCID,例如 LCID 1049(俄语)。 在这种情况下,不会从此列的语义索引返回任何结果。