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:关闭全文搜索查询的停用词的主要内容,如果未能解决你的问题,请参考以下文章
我可以以编程方式配置 PostgreSQL 以不消除全文搜索中的停用词吗?