创建全文索引时选择语言

创建全文索引时,需要为索引列指定列级语言。 指定语言的 断字符和词干分析器 将由列上的全文查询使用。 在创建全文索引时,选择列语言时需要考虑几个事项。 这些注意事项与文本的标记化方式以及 Full-Text 引擎编制索引的方式相关。

注释

若要为全文索引列指定列级语言,请在指定列时使用 LANGUAGE language_term 子句。 有关详细信息,请参阅 CREATE FULLTEXT INDEX (Transact-SQL)ALTER FULLTEXT INDEX (Transact-SQL)

Full-Text 搜索中的语言支持

本节提供对断词器和词干分析器的介绍,并讨论了全文搜索如何使用列级语言的 LCID。

分词器和词干分析器简介

SQL Server 2008 及更高版本包括一系列全新的断词器和词干分析器,这些工具明显优于以前在 SQL Server 中提供的对应工具。

注释

Microsoft自然语言组(MS NLG)实现了并支持这些新的语言组件。

新的断字符具有以下优势:

  • 鲁棒性

    测试表明,新的分词器在高压查询环境中是可靠的。

  • 安全

    由于语言组件的安全性改进,SQL Server 中默认启用新的断字符。 强烈建议对断字符和筛选器等外部组件进行签名,以提高 SQL Server 的整体安全性和稳定性。 可以配置全文以验证这些组件是否已签名,如下所示:

    EXEC sp_fulltext_service 'verify_signature';  
    
  • 质量

    断字符经过重新设计,测试表明,新的断字符提供比以前的断字符更好的语义质量。 这会增加召回率。

  • SQL Server 支持广泛的语言列表,词断符已默认包含并启用。

有关 SQL Server 所包含的分词器和词干分析器支持的语言列表,请参阅 sys.fulltext_languages(Transact-SQL)。

如何在Full-Text搜索中使用Column-Level语言的名称

创建全文索引时,需要为每个列指定有效的语言名称。 如果语言名称有效,但未由 sys.fulltext_languages(Transact-SQL) 目录视图返回,全文搜索将回退到同一语言系列最接近的可用语言名称(如果有)。 否则,全文搜索将回退到中性分词器。 此回退行为可能会影响召回准确性。 因此,强烈建议在创建全文索引时为每个列指定有效的可用语言名称。

注释

LCID 用于所有适合进行全文索引的数据类型(如 charnchar)。 如果列的类型为charvarchartext,并且其排序顺序设置为不同于 LCID 标识的语言设置,无论如何,LCID 在这些列的全文索引和查询时仍会使用。

断字

断字符会将被索引的文本根据语言特定的单词边界进行分词。 因此,分词行为在各个语言之间存在差异。 如果使用一种语言 x 为多种语言 {x、 y 和 z} 编制索引,则某些行为可能会导致意外结果。 例如,短划线(-)或逗号(,)可能是一个分词元素,在某种语言中可能会被忽略,而在另一种语言中则不会。 偶尔可能会出现出乎意料的词干处理,因为给定的单词在不同语言中可能会有不同的词干处理方式。 例如,在英语中,单词边界通常是空白或某种形式的标点符号。 在其他语言中,如德语、单词或字符可以组合在一起。 因此,您选择的列级语言应表示您预期将存储在该列行中的语言。

西方语言

对于西方语言家族,如果你不确定哪些语言将存储在某一列中,或者你预期会存储多种语言,一般解决方法是使用分词器处理可能存储在列中的最复杂语言。 例如,你可能希望将英语、西班牙语和德语内容存储在单个列中。 这三种西方语言具有非常相似的断字模式,德语模式是最复杂的。 因此,一个不错的选择是使用德语分词器,这应该能够正确处理英语和西班牙语文本。 相比之下,由于德语的复合词,英语文本处理程序可能无法完美处理德语文本。

请注意,使用语系中最复杂语言的分词器不能保证对语系中每种语言进行完美的索引处理。 在某些极端案例中,最复杂的断词工具可能无法正确处理使用其他语言编写的文本。

非西方语言

对于非西方语言(如中文、日语、印地语等),出于语言原因,上述解决方法不一定起作用。 对于非西方语言,请考虑以下解决方法之一:

  • 对于不同语系的语言

    如果列可能包含截然不同的语言,例如西班牙语和日语,请考虑将不同语言的内容存储在单独的列中。 这样,就可以对每一列使用特定于语言的断字符。 如果选择此解决方案且在查询时不知道查询语言,则可能需要针对这两列发出查询,以确保查询找到正确的行或文档。

  • 对于二进制内容(如 Microsoft Word 文档)

    当索引内容的类型为binary类型时,负责处理文本内容的全文搜索筛选器可能会遵循二进制文件中现有的特定语言标记,在将文本内容发送到断字器之前进行处理。 在这种情况下,在编制索引时,筛选器将为文档或文档部分发出正确的 LCID。 然后,Full-Text 引擎将调用与该 LCID 相关联的语言词语分隔器。 但是,在为多语言内容编制索引后,建议验证内容是否已正确编制索引。

  • 对于纯文本内容

    当内容为纯文本时,可以将其 xml 转换为数据类型,并添加语言标记,以指示对应于每个特定文档或文档部分的语言。 但是,若要执行此作,需要在全文索引之前了解语言。

词干

选择列级语言时的额外考虑因素是词干化。 全文查询中的词干提取是在特定语言中,搜索某个单词的所有词干(屈折)衍生形式的过程。 使用通用分词器处理多种语言的文本时,词干处理过程仅适用于为列指定的语言,而不适用于列中的其他语言。 例如,德语词干分析器不适用于英语或西班牙语(等等情况相同)。 这可能会影响召回率,具体取决于在查询时选择的语言。

列类型对 Full-Text 搜索的影响

语言选择中的另一个注意事项与数据的表示方式相关。 对于未存储在 varbinary(max) 列中的数据,不会执行特殊筛选。 相反,文本通常通过断字组件 as-is传递。

此外,断词工具主要用于处理书面文本。 因此,如果在文本上具有任何类型的标记(如 HTML),在索引和搜索期间可能无法获得极大的语言准确性。 在这种情况下,你有两种选择-首选方法只是将文本数据存储在 varbinary(max) 列中,并指示其文档类型,以便对其进行筛选。 如果这不是一个选项,则可以考虑使用中性词分隔符,如果可能,请将标记数据(如 HTML 中的“br”)添加到噪声词列表中。

注释

指定中性语言时,基于语言的词干分析不会发挥作用。

在 Full-Text 查询中指定非默认 Column-Level 语言

默认情况下,在 SQL Server 中,全文搜索将使用全文子句中包含的每列指定的语言分析查询词。 若要替代此行为,请在查询时指定非默认语言。 对于其资源已安装的受支持语言,CONTAINSCONTAINSTABLEFREETEXTFREETEXTTABLE 查询中的 LANGUAGE language_term 子句可用于指定查询词的断字、词干提取、同义词库和停用词处理所用的语言。

另请参阅

CONTAINS (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
数据类型 (Transact-SQL)
FREETEXT (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
配置和管理搜索筛选器
sp_fulltext_service(Transact-SQL)
sys.fulltext_languages(Transact-SQL)
配置和管理用于搜索的断词器和词干提取器