【问题标题】:SQL Problem: Using CONTAINS() doesn't work, but LIKE works fineSQL 问题:使用 CONTAINS() 不起作用,但 LIKE 工作正常
【发布时间】:2010-10-09 22:28:55
【问题描述】:

我在 SQL Server 数据库中有一个 Products 表,我必须对使用全文索引的旧存储过程进行故障排除。出于我们的目的,假设 Products 表有两个字段 ID,Keywords。关键字字段填充以下内容:

ROLAND SA-300 这款 Roland SA-300 是 完好无损!

当我运行以下语句时,我能够检索记录:

SELECT * FROM Products WHERE Keywords LIKE '%SA-300%'

但是,当我运行以下任何语句时,我得到的结果为零:

SELECT * FROM Products WHERE CONTAINS(Keywords, ' SA-300 ')
SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA-300')
SELECT * FROM Products WHERE CONTAINS(Keywords, '"SA-300"')
SELECT * FROM Products WHERE CONTAINS(Keywords, '"*SA-300*"')

但我知道 CONTAINS() 函数正在工作,因为当我运行其中任何一个时都会得到结果:

SELECT * FROM Products WHERE CONTAINS(Keywords, ' Roland ')
SELECT * FROM Products WHERE CONTAINS(Keywords, 'Roland')
SELECT * FROM Products WHERE CONTAINS(Keywords, '"Roland"')
SELECT * FROM Products WHERE CONTAINS(Keywords, '"*Roland*"')
SELECT * FROM Products WHERE CONTAINS(Keywords, 'Roland')

我需要弄清楚为什么 CONTAINS() 函数不适用于“SA-300”术语。我是全文索引的新手,因此不胜感激。

【问题讨论】:

  • 没有线索,但你检查过索引是最新的吗?

标签: sql-server tsql full-text-search


【解决方案1】:

啊!谢谢@GregD。我们在查找“this*”或“never*”时没有找到字符串“this never ends”。原来两个词都在noiseENG.txt中。

看起来不可能在每个查询的基础上关闭它,但基于此: SQL 2008: Turn off Stop Words for Full Text Search Query

我跑了

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF

我们开始得到我们想要的结果。

【讨论】:

    【解决方案2】:

    原来我需要重新构建我的全文索引。感谢@MichaelGG 和@JohnFx 的提示

    【讨论】:

      【解决方案3】:

      您查看过您的干扰词文件吗?在我的机器上,它位于 c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\FTData\noiseENG.txt

      您可以测试这一点的一种方法是编辑您的特定噪声文件,只使用一个空格,以便它索引所有内容并再次尝试您的查询。我会在测试环境中“测试”它,而不是在生产环境中。

      【讨论】:

        【解决方案4】:

        两个想法:

        (1) 连字符可能被视为分词 这些返回什么?

        SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA')
        SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA 300')
        SELECT * FROM Products WHERE CONTAINS(Keywords, 'SA300')
        

        看到这个other question

        (2) 您是否尝试过重建全文索引?它可能已经过时了。

        【讨论】:

          【解决方案5】:

          你可以试试

          SELECT * FROM Products WHERE CONTAINS(Keywords, ' "SA-300" ')
          

          我在 msdn 上看到了您尝试执行的操作的示例。

          【讨论】:

          • 我不知道空白是否重要。我猜不是。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-08
          • 1970-01-01
          • 1970-01-01
          • 2016-02-29
          • 2016-06-08
          • 1970-01-01
          相关资源
          最近更新 更多