You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,你需要做这些调整:

  1. 确保同义词库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>
    
  2. 重新加载同义词库后,改用THESAURUS选项查询:
    SELECT * FROM dbo.THES_TEST WHERE Contains(Word,'FORMSOF(THESAURUS,"jog")');
    
  3. 补充验证:执行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。

解决步骤如下:

  1. 使用对应英语的LCID 1033调用分析器:
    SELECT 'A' as A,* FROM sys.dm_fts_parser('x-rated', 1033, 0, 0);
    
  2. 确认Custom1033.lex格式正确:每行一个词,无多余空格,编码保持你设置的UCS2 LE BOM即可。
  3. 执行命令让自定义词典生效:
    EXEC sp_fulltext_service 'update_languages';
    EXEC sp_fulltext_service 'restart_all_fdhosts';
    

补充说明:默认情况下SQL Server分词器会拆分带连字符的词,但自定义词典里的词会被识别为单个整体,用正确LCID后x-rated就会作为单个词条返回,不会被拆分。

内容的提问来源于stack exchange,提问作者Bruno C

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:30:10