2011-12-08 116 views
20

我遇到了不少困难,找到了一个很好的解决办法停止词:SQL 2008:关闭全文搜索查询

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

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

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

问题是在这个例子中,这个词“非常”在停止字的标准列表中显示

即使有一行名为“Very Good Company”的行,也会导致查询返回无行。

我的问题是,我将如何去关闭停用词为我的查询?或者我会如何去除它们?

或者还有另一种方法我应该去关于此搜索?

回答

34

在在这个问题万一别人绊倒:

它看起来像有一个选项,2008年要做到这一点;这对我来说并不明显,因为数据库从2005年开始升级,我不认为这是一种选择。

你需要做的是设置兼容级别上升到2008年的第一件事情:

ALTER DATABASE [MyDatabase] SET COMPATIBILITY_LEVEL = 100 

然后,创建通过向导的全文索引的时候,有一个步骤,让你忽略禁用词该指数

编辑:这里的脚本做得一样好:

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF 
+0

这工作完美。 – James

+9

将它重新打开有点隐藏在BOL中。你不只是将它设置为ON,而是需要将它设置为你自己的一个停止列表的名称,或者使用'SYSTEM'来使用内建的:'ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = SYSTEM' – Rhumborl

15

默认情况下,SQL Server中的禁用词不忽略。

这是你想要做什么:

sp_configure 'show advanced options', 1; 
RECONFIGURE; 
GO 
sp_configure 'transform noise words', 1; 
RECONFIGURE; 
GO 

REF:http://msdn.microsoft.com/en-us/library/ms187914%28v=sql.100%29.aspx

+0

您不想像其他帖子那样关闭停用词列表。性能成为大数据集的问题。 –

+0

尽管它与前缀匹配不起作用 - 如果你搜索的是“cat *”和“*”,那就是。 – strider

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 

只是追加*您搜索,问题就解决了。