创建全文索引时选择语言

适用于:SQL ServerAzure SQL 数据库

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

注意

若要为全文索引列指定列级语言,请在指定列时使用该 LANGUAGE <language_term> 子句。 有关详细信息,请参阅 CREATE FULLTEXT INDEXALTER FULLTEXT INDEX

本部分介绍断字符和词干分析器,并讨论 Full-Text 搜索如何使用列级语言的语言代码标识符(LCID)。

断字符和词干分析器简介

SQL Server 包括一系列断字符和词干分析器。 Microsoft自然语言组(NLG)实现并支持这些语言组件。

断字符提供以下优势:

  • 稳定性

    测试表明断字符在高压查询环境中是可靠的。

  • 安全性

    默认情况下,在 SQL Server 中启用断字符。 我们极力建议对诸如断字符和筛选器之类的外部组件进行签名以提高 SQL Server 的整体安全性和可靠性。 可以按如下方式配置全文查询以验证是否对这些组件进行了签名:

    EXECUTE sp_fulltext_service 'verify_signature';
    
  • 质量

    内部测试表明断字符提供比以前的断字符更好的语义质量。 这提高了恢复准确性。

  • 对于许多语言来说,断字符已包含在 SQL Server 中,并在默认情况下处于启用状态。

有关 SQL Server 包含断字符和词干分析器的语言列表,请参阅 sys.fulltext_languages

Full-Text 搜索如何使用列级语言的名称

创建全文索引时,需要为每一列指定有效的语言名称。 如果语言名称有效,但 sys.fulltext_languages目录视图 未返回,Full-Text 搜索会回退到同一语言系列最近的可用语言名称(如果有)。 否则,Full-Text 搜索将回退到中性断字符。 这种回退行为可能会影响恢复的准确性。 因此,我们极力建议您在创建全文索引时为每一列指定有效且可用的语言名称。

注意

将对可创建全文索引的所有数据类型(例如 charnchar)使用 LCID。 如果将 charvarchartext 类型的列的排序顺序设置为不同于 LCID 所标识语言的语言设置,则在对这些列进行全文索引和查询时,始终使用该 LCID。

断字

可使用断字符基于词的边界对要创建索引的文本进行标记,词的边界则取决于特定语言。 因此,断字行为因语言而异。 如果使用一种语言 x来为多种语言 {xyz}编制索引,则某些行为可能会导致意外结果。 例如,短划线(-)或逗号(,)可能是一个断字符元素,它以一种语言而不是在另一种语言中抛出。 在极少数情况下,也可能会出现意外的词干分析行为,原因是给定字词的词干分析可能因语言而异。 例如,在英语中,词的边界通常是空格或某些标点符号。 在其他语言中,如德语、单词或字符可能组合在一起。 因此,所选的列级语言应表示预期存储在该列的行中的语言。

西方语言

对于西方语言系列,如果你不确定哪些语言将存储在列中,或者希望存储多个语言,一般解决方法是将断字符用于可能存储在列中的最复杂语言。

例如,你可能希望将英语、西班牙语和德语内容存储在单个列中。 这三种西方语言具有类似的断字模式,德语模式是最复杂的。 因此,这种情况下的明智选择是使用德语断字符,它应能正确地处理英语和西班牙语文本。 与此不同,英语断字符则可能会由于德语中的复合词而无法完美地处理德语文本。

使用语言系列中最复杂语言的断字符不能保证对家庭中每种语言进行完美的索引编制。 可能存在最复杂的断字符无法正确处理以其他语言编写的文本的角点情况。

非西方语言

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

  • 对于其他不同语系的语言

    如果一个列中可能包含显著不同的语言(例如,西班牙语和日语),请考虑将这些不同语言的内容存储在不同的列中。 这种分隔允许你对每一列使用特定于语言的断字符。 如果选择此解决办法,但却不知道查询时的查询语言,则可能需要对两个列都发出查询,以确保查询能够找到正确的行或文档。

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

    当索引内容为 二进制 类型时,在将文本内容发送到断字符之前处理文本内容的 Full-Text 搜索筛选器可能遵循二进制文件中现有的特定语言标记。 在这种情况下,在编制索引时,筛选器会为文档或文档部分发出正确的 LCID。 然后,Full-Text 引擎使用该 LCID 调用语言的断字符。 不过,在为多语言内容创建索引后,我们建议您验证是否为这些内容正确地创建了索引。

  • 对于纯文本内容

    当内容为纯文本时,您可以将其转换为 xml 数据类型,并添加用来表示与每个特定文档或文档部分相对应的语言的语言标记。 不过,若要使此方法可行,您需要在创建全文索引之前知道相应的语言。

词干

选择列级语言的另一个考虑因素是 词干化。 全文查询中的词干是在特定语言中搜索单词的所有词干(转折)形式的过程。 当使用一般断字符处理多种语言时,词干分析过程仅对为相应列指定的语言起作用,对于此列中的其他语言则不起作用。 例如,德语词干分析器不适用于英语或西班牙语(等等)。 这可能会影响恢复操作,具体取决于你在查询时选择使用的语言。

选择语言时的另一个注意事项与数据的表示方式有关。 对于未存储在 varbinary(max) 列中的数据,不执行任何特殊筛选。 而一般通过断字组件按原样传递该文本。

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

注意

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

在全文查询中指定非默认列级语言

默认情况下,在 SQL Server 中,Full-Text 搜索使用全文子句中包含的每个列指定的语言分析查询词。 若要覆盖此行为,请指定查询时使用的非默认语言。 对于已安装资源的受支持语言,LANGUAGE <language_term>CONTAINS、CONTAINSTABLEFREETEXT 或 FREETEXTTABLE 查询的子句可用于指定用于断字、词干、同义词库和查询词的非索引字处理的语言。