29

我很难找到一个好的解决方案:

假设我有一个“公司”表,其中有一列名为“名称”。我在这个专栏上有一个全文目录。如果用户搜索“非常好的公司”,我的查询将是:

SELECT
    *
FROM
    Company
WHERE
    CONTAINS(Name, '"Very" AND "Good" AND "Company"')

问题是在这个例子中,“非常”这个词出现在标准的停用词列表中:

SELECT
    ssw.*
FROM
    sys.fulltext_system_stopwords ssw
WHERE
    ssw.language_id = 1033;

导致查询返回没有行,即使有一行名称为“非常好的公司”。

我的问题是,我将如何关闭查询的停用词?或者我将如何完全删除它们?

还是我应该以另一种方式进行此搜索?

4

3 回答 3

47

万一其他人偶然发现了这个问题:

看起来在 2008 年可以选择这样做;这对我来说并不明显,因为数据库是从 2005 年升级的,我不认为这是一个选择。

您需要做的第一件事是将兼容级别设置为 2008:

ALTER DATABASE [MyDatabase] SET COMPATIBILITY_LEVEL = 100

然后,通过向导创建全文索引时,有一个步骤可以让您忽略索引的停用词

编辑:这也是执行此操作的脚本:

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF
于 2011-12-08T19:21:06.497 回答
17

在 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

于 2012-05-04T14:59:48.090 回答
1

我今天早些时候在全文搜索中遇到了这个问题。

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

因此,在您的参数中,只需将 * 附加到您的搜索中即可解决问题。

于 2013-09-16T18:17:50.370 回答