我很难找到一个好的解决方案:
假设我有一个“公司”表,其中有一个名为“名称”的列。我在这个专栏上有一个全文目录。如果用户搜索“非常好的公司”,我的查询将是:
SELECT
*
FROM
Company
WHERE
CONTAINS(Name, '"Very" AND "Good" AND "Company"')
问题在于此示例中,“非常”一词出现在标准的停用词列表中:
SELECT
ssw.*
FROM
sys.fulltext_system_stopwords ssw
WHERE
ssw.language_id = 1033;
导致查询返回时没有行,即使有一行名为“Very Good Company”。
我的问题是,如何在我的查询中关闭停用词?或者我将如何完全删除它们?
或者我还有其他方法可以进行此搜索吗?
答案 0 :(得分:44)
如果其他人偶然发现了这个问题:
看起来在2008年可以选择这样做;这对我来说并不明显,因为数据库从2005年开始升级,我认为这不是一个选择。
您需要做的第一件事是将兼容性级别设置为2008:
ALTER DATABASE [MyDatabase] SET COMPATIBILITY_LEVEL = 100
然后,当通过向导创建全文索引时,有一个步骤允许您忽略索引的停用词
编辑:以下是执行此操作的脚本:
ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF
答案 1 :(得分:16)
默认情况下,SQL Server中不会忽略停用词。
这是你想要做的:
sp_configure 'show advanced options', 1;
RECONFIGURE;
GO
sp_configure 'transform noise words', 1;
RECONFIGURE;
GO
参考:http://msdn.microsoft.com/en-us/library/ms187914%28v=sql.100%29.aspx
答案 2 :(得分:0)
我今天早些时候在全文搜索时遇到了这个问题。
151-663049 - returns result
151-66304 - no result
151-6630 - no result
151-663 - no result
151-66 - no result
151-6 - returns result
151 - returns result
151 returns result
但我读了一篇帖子,说要绕过这个问题,在每次搜索结束时追加*。 http://social.msdn.microsoft.com/Forums/sqlserver/en-US/fae33a6b-7c7c-4c11-842c-ca5277ed824f/ms-sql-server-2008-r2-fulltext-search-problem
151-663049* - returns result
151-66304* - returns result
151-6630* - returns result
151-663* - returns result
151-66* - returns result
151-6* - returns result
151-* - returns result
151* - returns result
因此,在您的参数中,只需将*附加到您的搜索中并解决问题。