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

Posted

技术标签:

【中文标题】SQL 2008:关闭全文搜索查询的停用词【英文标题】:SQL 2008: Turn off Stop Words for Full Text Search Query 【发布时间】:2012-01-16 03:52:58 【问题描述】:

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

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

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

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

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

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

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

或者我应该以其他方式进行此搜索吗?

【问题讨论】:

【参考方案1】:

如果其他人偶然发现这个问题:

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

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

ALTER DATABASE [MyDatabase] SET COMPATIBILITY_LEVEL = 100

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

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

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF

【讨论】:

重新打开它有点隐藏在 BOL 中。您不仅将其设置为 ON,还需要将其设置为您自己的停止列表之一的名称或使用 SYSTEM 来使用内置名称:ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = SYSTEM【参考方案2】:

在 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

【讨论】:

您不想像其他帖子一样关闭停用词列表。大型数据集的性能成为问题。 它不适用于前缀匹配 - 如果您搜索 "cat*" and "the*" 就是这样。【参考方案3】:

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

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

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

【讨论】:

以上是关于SQL 2008:关闭全文搜索查询的停用词的主要内容,如果未能解决你的问题,请参考以下文章

忽略查询中的mysql全文停用词

我可以以编程方式配置 PostgreSQL 以不消除全文搜索中的停用词吗?

如何获取我的全文目录中使用的停用词列表?

即使停用词列表为空,如果包含停用词,全文搜索也不起作用

使用全文搜索来查找部分单词 (SQL Server 2008)

如何提高sql2000全文检索搜索效率