Sql server SQL问题:使用CONTAINS()不会';我不工作,但喜欢工作很好

Sql server SQL问题:使用CONTAINS()不会';我不工作,但喜欢工作很好,sql-server,tsql,full-text-search,Sql Server,Tsql,Full Text Search,我在SQL Server数据库中有一个Products表,我必须对使用全文索引的遗留存储过程进行故障排除。出于我们在这里的目的,让我们假设Products表有两个字段ID和关键字。“关键字”字段将填充以下内容: 罗兰SA-300这款罗兰SA-300是 在薄荷状态 当我运行以下语句时,我能够检索记录: SELECT * FROM Products WHERE Keywords LIKE '%SA-300%' 但是,当我运行以下任何语句时,都不会得到任何结果: SELECT * FROM Prod

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

罗兰SA-300这款罗兰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'术语上不起作用。我不熟悉全文索引,因此非常感谢您的帮助。

您能试试吗

SELECT * FROM Products WHERE CONTAINS(Keywords, ' "SA-300" ')
我看到了一个例子,说明您正在尝试做什么。

两个想法:

(1) 连字符可能被视为断字 这些是什么回报

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


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

您有没有查看过您的noise words文件?在我的机器上,它位于c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\FTData\noiseENG.txt


可以测试这一点的一种方法是,只使用一个空格编辑特定的噪波文件,以便它对所有内容进行索引,然后重试查询。我会在测试环境中而不是在生产环境中“测试”这一点。

结果表明,我需要重新构建全文索引。感谢@MichaelGG和@JohnFx的提示

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

看起来不可能在每个查询的基础上关闭此功能,但基于此:

我跑


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

没有线索,但是你检查过索引是最新的吗?我不知道空白是否重要。我想不是。
ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF