对表和列启用语义搜索

介绍如何对包含文档或文本的选定列启用或禁用统计语义索引。

统计语义搜索使用 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 表的 TitleDocumentSummaryDocument 列上创建的,而语义索引仅在文档列上创建。 此全文索引使用新创建的全文目录和现有的唯一键索引, 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(俄语)。 在这种情况下,不会从此列的语义索引返回任何结果。