SQL 2008:关闭全文搜索查询中的停用词

29

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

假设有一张名为“公司”的表,其中有一个名为“名称”的列,我在这一列上建立了一个全文索引。如果用户搜索“非常好的公司”,我的查询语句将是:

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

问题在于这个例子中,“Very”这个词出现在常见停用词列表中:

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

查询结果没有返回任何行,即使有一个名称为“很好的公司”的行。

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

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

3个回答

48

如果其他人也遇到这个问题:

看起来在2008年有一种方法可以实现这个,但我并没有意识到,因为这个数据库是从2005年升级的,我不认为这是一个选项。

你需要做的第一件事是将兼容性级别提升到2008年:

ALTER DATABASE [MyDatabase] SET COMPATIBILITY_LEVEL = 100

然后,当通过向导创建全文索引时,有一步允许你忽略索引的停用词

编辑:下面是执行此操作的脚本:

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF

14
在BOL中重新打开它有些隐蔽。你不能只将其设置为ON,而是需要将其设置为自己停用词列表的名称或使用SYSTEM来使用内置的停用词列表:ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = SYSTEM - Rhumborl

17

1
您不想像其他帖子那样关闭停用词列表。在处理大数据集时,性能会成为一个问题。 - Matt Whittingham
然而,它无法与前缀匹配一起使用 - 如果您搜索“cat *”和“the *”。 - strider

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

在你的参数中加上*,就可以解决问题了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接