SQL Server 2017同义词库/自定义词典异常及全文搜索问题问询
问题分析与解决方案
一、FORMSOF(INFLECTIONAL,"jog") 返回0条记录的原因
首先得理清INFLECTIONAL和THESAURUS的核心区别:
FORMSOF(INFLECTIONAL, ...)依赖SQL Server内置的词干分析器,只处理同一个单词的不同形态(比如run对应running/ran,jog对应jogging/jogged),完全不会关联同义词。FORMSOF(THESAURUS, ...)才会调用你配置的同义词库(tsenu.xml)来匹配同义词。
你的表THES_TEST里只有running、IE、Run,没有任何和jog形态相关的词(比如jog/jogging),所以用INFLECTIONAL,"jog"返回0条是正常的逻辑结果。
如果想让jog能匹配run/running,你需要做这些调整:
- 确保同义词库
tsenu.xml的配置正确,添加包含jog和run的扩展组:<thesaurus xmlns="http://schemas.microsoft.com/sqlserver/2004/07/fulltext/thesaurus"> <diacritics_sensitive>0</diacritics_sensitive> <expansion> <sub>run</sub> <sub>running</sub> <sub>jog</sub> <sub>jogging</sub> </expansion> </thesaurus> - 重新加载同义词库后,改用
THESAURUS选项查询:SELECT * FROM dbo.THES_TEST WHERE Contains(Word,'FORMSOF(THESAURUS,"jog")'); - 补充验证:执行
sys.sp_fulltext_load_thesaurus_file 1033后,若表已有全文索引,建议重新填充一次索引确保配置生效。
二、自定义词典Custom1033.lex未生效,x-rated被拆分的原因
这个问题的核心是LCID(语言代码)不匹配:
- 你的自定义词典是
Custom1033.lex,对应的是英语(LCID 1033)的分词器。 - 但你调用
sys.dm_fts_parser时用的LCID是1030,这是丹麦语(da-DK)的LCID,丹麦语的分词器不会加载英语的自定义词典,自然按默认规则拆分x-rated。
解决步骤如下:
- 使用对应英语的LCID 1033调用分析器:
SELECT 'A' as A,* FROM sys.dm_fts_parser('x-rated', 1033, 0, 0); - 确认
Custom1033.lex格式正确:每行一个词,无多余空格,编码保持你设置的UCS2 LE BOM即可。 - 执行命令让自定义词典生效:
EXEC sp_fulltext_service 'update_languages'; EXEC sp_fulltext_service 'restart_all_fdhosts';
补充说明:默认情况下SQL Server分词器会拆分带连字符的词,但自定义词典里的词会被识别为单个整体,用正确LCID后x-rated就会作为单个词条返回,不会被拆分。
内容的提问来源于stack exchange,提问作者Bruno C
相关产品推荐
相关产品推荐

