SQL问题:使用CONTAINS()不起作用,但LIKE工作正常

时间:2009-02-25 21:42:40

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

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

  

ROLAND SA-300这款Roland SA-300是   在MINT条件下!

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

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'术语。我是全文索引的新手,所以感谢任何帮助。

5 个答案:

答案 0 :(得分:13)

两个想法:

(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)您是否尝试过重建全文索引?它可能已经过时了。

答案 1 :(得分:4)

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

答案 2 :(得分: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

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:-1)

你能试试吗

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

我看到了您在msdn上尝试做的一个示例。