创建全文索引时选择语言的最佳实践

创建全文索引时,需要为索引列指定列级语言。所指定语言的断字符和词干分析器将由针对相应列的全文查询使用。如果要在创建全文索引时选择列语言,有几个事项需要注意。这些注意事项均与全文引擎如何对文本进行词语切分再编制其索引有关。

注意注意

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

断字符

可使用断字符基于词的边界对要创建索引的文本进行词语切分,词的边界则取决于特定语言。因此,断字行为因语言而异。如果使用一种语言 x 对许多语言 {x, y, and z} 创建索引,则某些行为可能会导致意外结果。例如,破折号 (-) 或逗号 (,) 可能是在一种语言中被丢弃而在另一种语言中却不会被丢弃的断字元素。在极少数情况下,也可能会出现意外的词干分析行为,原因是给定字词的词干分析可能因语言而异。例如,在英语中,词的边界通常是空格或某些标点符号。在其他语言(例如德语)中,字词或字符有可能组合在一起。因此,选择的列级语言应当为要存储在相应列的各行中的语言。

西方语言

对于西方语系,如果您不确定将在列中存储哪种语言或者您期望存储多种语言,则常规解决方法是使用可能在列中存储的最复杂语言的断字符。例如,您可能希望在单个列中存储英语、西班牙语和德语内容。这三种西方语言拥有非常相似的断字模式,其中德语模式是最复杂的。因此,这种情况下的明智选择是使用德语断字符,它应能正确地处理英语和西班牙语文本。与此不同,英语断字符则可能会由于德语中的复合词而无法完美地处理德语文本。

请注意,使用某一语系中最复杂语言的断字符不能保证针对此语系中的每一种语言都能够完美地创建索引。也可能存在以下极端情况:最复杂语言的断字符无法正确处理使用其他语言书写的文本。

非西方语言

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

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

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

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

    当创建索引的内容为 binary 类型时,用来对文本内容进行处理然后将其发送给断字符的全文搜索筛选器可能会使用该二进制文件中现有的特定语言标记。在这种情况下,当创建索引时,筛选器将发出文档或文档某片段的正确 LCID。然后,全文引擎将使用此 LCID 调用相应语言的断字符。不过,在为多语言内容创建索引后,我们建议您验证是否为这些内容正确地创建了索引。

  • 对于纯文本内容

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

词干分析

选择列级语言时的另外一个注意事项是词干分析。全文查询中的“词干分析”是指搜索特定语言中某个词的所有词干派生形式(变形)的过程。当使用一般断字符处理多种语言时,词干分析过程仅对为相应列指定的语言起作用,对于此列中的其他语言则不起作用。例如,德语词干分析器对于英语或西班牙语(等语言)不起作用。这可能会影响恢复操作,具体取决于您选择在查询时要使用的语言。

数据存储方法对全文搜索的影响

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

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

注意注意

当指定非特定语言时,基于语言的词干分析将不起作用。

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

默认情况下,在 SQL Server 2008 中,全文搜索将使用在全文子句中包括的为每一列指定的语言来分析查询词条。若要覆盖此行为,请指定查询时使用的非默认语言。对于那些已安装相应资源的受支持语言,可以使用 CONTAINSCONTAINSTABLEFREETEXTFREETEXTTABLE 查询的 LANGUAGE language_term 子句来指定要用于对查询词条进行断字、词干分析、同义词库和非索引字处理的语言。

语言支持

本节简单介绍了断字符和词干分析器,并讨论了全文搜索是如何使用列级语言的 LCID 的。

断字符和词干分析器简介

SQL Server 2008 包含一系列全新的断字符和词干分析器,这些断字符和词干分析器要明显优于以前在 SQL Server 中提供的断字符和词干分析器。

注意注意

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

这些新的断字符具有以下好处:

  • 可靠

    测试表明这些新的断字符在高压查询环境中非常可靠。

  • 安全

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

    EXEC sp_fulltext_service 'verify_signature';
    
  • 质量高

    断字符已经过重新设计,测试表明这些新断字符能够提供比以往断字符更好的语义质量。这为 SQL Server 2008 用户提高了恢复准确性。

  • 涵盖范围广

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

有关 SQL Server 2008 中已包含其断字符和词干分析器的语言的列表,请参阅 sys.fulltext_languages (Transact-SQL)

第三方断字符

有若干外部第三方断字符可供 SQL Server 2008 使用。可以手动注册这些断字符。有关详细信息,请参阅如何加载经过许可的第三方断字符

在加载外部(第三方)断字符之后,需要通过执行指定了 update_languages 选项的 sp_fulltext_service 系统存储过程来刷新全文支持语言的列表,如下所示:

EXEC sp_fulltext_service 'update_languages';

然后,新加载了断字符的语言将在 sys.fulltext_languages 目录视图中列出。

全文搜索使用列级语言名称的方式

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

注意注意

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