如何让SQL Server 2012全文搜索忽略点号作为单词分隔符?
解决SQL Server 2012全文搜索中句点作为单词分隔符的问题
当然可以调整!针对你提到的含句点的有意义字符串需要作为完整检索令牌的需求,我们可以通过两种主要方式来实现,下面给你详细拆解:
方法一:自定义词典(推荐,安全且针对性强)
这种方法不需要修改系统核心配置,只需要告诉全文搜索哪些带句点的字符串是完整的“单词”:
- 首先创建一个纯文本文件(比如命名为
CustomEnglishTerms.txt),每行写入你需要作为完整令牌的含句点字符串,比如:user.profile product.v2.3 api.endpoint - 把这个文件放到SQL Server的全文搜索词典目录下,默认路径是
C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\FTData(记得根据你的实例名称调整路径) - 执行SQL语句,将这个自定义词典关联到英文全文语言:
ALTER FULLTEXT LANGUAGE English ADD DICTIONARY 'CustomEnglishTerms.txt'; - 最后重新生成你的全文索引,让配置生效:
ALTER FULLTEXT INDEX ON YourTargetTableName REBUILD;
这样之后,全文搜索就会把你定义的这些带句点的字符串当作完整的检索令牌,不会再拆分它们。
方法二:修改系统分词器配置(不推荐,影响全局)
如果你需要全局取消句点的分隔符属性,可以修改英文分词器的系统配置,但要注意这个操作会影响所有使用英文分词器的全文索引,且SQL Server更新可能会覆盖修改:
- 找到英文分词器的XML配置文件,默认路径是
C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn\Resources\1033\enu.xml - 打开文件后,找到
<WordBreaker>相关的规则段落,移除其中将句点(.)标记为分隔符的配置项 - 修改完成后,重启SQL Server服务,再重新生成所有相关的全文索引
另外还有个临时的 workaround:如果只是少数特定字符串,你也可以在插入数据时把句点替换成下划线(比如user.profile改成user_profile),检索时也做同样替换,但这种方法需要修改数据,不太优雅,只适合临时场景。
内容的提问来源于stack exchange,提问作者Tim




