适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
创建全文索引时,为索引列指定列级语言。 针对该列的全文查询会使用指定语言的断字符和词干分析器。 考虑一下 Full-Text 引擎在选择列语言时如何标记和索引你的文本。
注意
若要为全文索引列指定列级语言,请在指定列时使用该 LANGUAGE <language_term> 子句。 有关详细信息,请参阅 CREATE FULLTEXT INDEX 和 ALTER FULLTEXT INDEX。
全文搜索中的语言支持
本节介绍了分词器和词干提取器,并讨论了全文搜索如何使用列级语言的语言代码标识符 (LCID)。
分词器和词干提取器简介
SQL Server 数据库引擎默认启用适用于多种语言的断字符和词干分析器。 Microsoft自然语言组(NLG)实现并支持这些语言组件。 有关支持语言的列表,请参见 sys.fulltext_languages。
外部组件(如分词器和筛选器)应进行签名以提高安全性。 若要验证签名,请运行以下命令:
EXECUTE sp_fulltext_service 'verify_signature';
全文搜索如何使用列级语言的名称
创建全文索引时,为每列指定一个有效的语言名称。 如果语言名称有效但 sys.fulltext_languages 目录视图未返回,Full-Text 搜索会回退到同一语言家族中最接近的可用语言名称(如果有的话)。 否则,全文搜索将回退到“中性”词分隔器。 为避免这种退回行为,请指定一个有效且可用的语言名称。
注意
将对可创建全文索引的所有数据类型(例如 char 或 nchar)使用 LCID。 如果将 char、 varchar或 text 类型的列的排序顺序设置为不同于 LCID 所标识语言的语言设置,则在对这些列进行全文索引和查询时,始终使用该 LCID。
断字
可使用断字符基于词的边界对要创建索引的文本进行标记,词的边界则取决于特定语言。 因此,不同语言的单词断分方式各不相同。 如果使用一种语言 x来为多种语言 {x, y和 z}编制索引,则某些行为可能会导致意外结果。 例如,短横线(-)或逗号(,)可能是断词元素,在一种语言中会被丢弃,而在另一种语言中则不会。 在极少数情况下,也可能会出现意外的词干分析行为,原因是给定字词的词干分析可能因语言而异。 例如,在英语中,词的边界通常是空格或某些标点符号。 在其他语言中,如德语,词汇或字符可能会组合使用。 因此,所选的列级语言应表示预期存储在该列的行中的语言。
西方语言
对于西方语言系列,如果你不确定哪些语言将存储在列中,或者希望存储多个语言,一般解决方法是将断字符用于可能存储在列中的最复杂语言。
例如,你可能希望将英语、西班牙语和德语内容存储在单个列中。 这三种西方语言具有类似的断字模式,德语模式是最复杂的。 因此,在这种情况下,一个不错的选择是使用德语单词分解器,它能够正确处理英语和西班牙语文本。 相比之下,由于德语中存在复合词,英文分词器可能无法很好地处理德语文本。
使用语言族中最为复杂的语言的词分隔器,并不能保证该语言族中每种语言都能被完美索引。 可能存在这样的边缘情况:即使是最复杂的分词器,也无法正确处理用另一种语言编写的文本。
非西方语言
对于非西方语言(如中文、日语、印地语等),上述变通方法因语言原因不一定奏效。 对于非西方语言,可以考虑以下一种变通方法:
对于其他不同语系的语言
如果一个列中可能包含显著不同的语言(例如,西班牙语和日语),请考虑将这些不同语言的内容存储在不同的列中。 这样,就可以对每一列使用特定于相应语言的断字符。 如果选择此解决办法,但却不知道查询时的查询语言,则可能需要对两个列都发出查询,以确保查询能够找到正确的行或文档。
对于二进制内容(如 Microsoft Word 文档)
当创建索引的内容为binary类型时,在将文本内容发送给断字符之前对其进行处理的全文搜索筛选器,可能会遵循二进制文件中的特定语言标记。 在这种情况下,在编制索引时,筛选器会为文档或文档部分发出正确的 LCID。 随后,全文搜索引擎会调用与该 LCID 对应的语言的词分隔器。 但在索引多语言内容后,请确认内容被正确索引。
对于纯文本内容
当内容为纯文本时,您可以将其转换为 xml 数据类型,并添加用来表示与每个特定文档或文档部分相对应的语言的语言标记。 不过,若要使此方法可行,您需要在创建全文索引之前知道相应的语言。
词干
选择列级语言时的另一个考虑因素是词干提取。 全文查询中的词干分析 是指搜索特定语言中某个词的所有词干派生形式(变形)的过程。 当你使用通用断词器处理多种语言时,词干提取过程仅对为该列指定的语言有效,而不适用于该列中的其他语言。 例如,德语词干提取器不适用于英语或西班牙语(以此类推)。 这种行为可能会根据你查询时选择的语言影响你的回忆。
列类型对全文搜索的影响
选择语言时的另一个注意事项与数据的表示方式有关。 对于未存储在 varbinary(max) 列中的数据,不执行任何特殊筛选。 而一般通过断字组件按原样传递该文本。
此外,分词器主要设计用于处理书面文本。 如果你的文本包含标记(如HTML),索引和搜索过程中的语言准确性可能会降低。 在这种情况下,你有两个选择:首选方法是将文本数据存储在 varbinary(max) 列中,并标明其文档类型以便进行过滤。 如果这种方法不可行,可以考虑使用中性分词器,并在可能的情况下,向噪声词列表中添加标记(例如 HTML 中的“br”)。
注意
当你指定中性语言时,基于语言的词干提取不会生效。
在全文查询中指定非默认的列级语言
默认情况下,在数据库引擎中,全文搜索使用为全文检索子句中每一列指定的语言来分析查询词。 若要覆盖此行为,请指定查询时使用的非默认语言。 对于已安装资源的支持语言,可以使用 LANGUAGE <language_term>、CONTAINSTABLE、FREETEXT 或 FREETEXTTABLE 查询中的 子句,来指定用于查询词的断词、词干提取、同义词表和停用词处理的语言。