sql 全文搜索 CONTAINS() *有时* 没有结果

Posted

技术标签:

【中文标题】sql 全文搜索 CONTAINS() *有时* 没有结果【英文标题】:sql full text search CONTAINS() *sometimes* yield no result 【发布时间】:2018-08-30 16:53:12 【问题描述】:

我在 2 个不同的数据库上重现了该问题,因此这可能是一个普遍问题。

基本上我们在表格上使用全文搜索,假设我们有表格 customer,它有 ID、名称、地址等列。全文搜索在名称列上。

以下脚本仅适用于“某些”行

select name, * 
from customer 
where contains(name, N' "foo bar" ')

如果客户名称是 foo bar,那么它将被返回。但如果客户名称是“GET”,则不会返回,即

select name, * 
from customer 
where contains(name, N' "GET" ') 

这不会返回该行,但如果我将名称的值更改为"GETS",那么它将返回。

很奇怪,可能"GET"是关键字,全文搜索不喜欢?我没有找到任何有关此的文档。

有没有办法绕过它?

【问题讨论】:

为什么不用 --> where name like '%foo bar%'? 我正在使用 MSSQL,我知道可以使用 LIKE %% 进行部分匹配,但由于我在名称上有索引,所以我想通过全文搜索进行更快的搜索。 【参考方案1】:

您的问题的答案非常简单:get 是系统定义的停用词,因此在搜索过程中会被忽略。

您可以像这样检查系统定义的停止列表中的单词:

select * from sys.fulltext_system_stopwords where language_id=1033

您可以像这样关闭索引的停止列表:

ALTER FULLTEXT INDEX ON customer SET STOPLIST = OFF

运行上述查询并尝试再次搜索get,看看是否返回任何结果。

更多关于停用词和停用词列表的信息可以在这里找到:Configure and Manage Stopwords and Stoplists for Full-Text Search。

【讨论】:

我有一个列,其中包含一些用管道“12|332|5|44”分隔的 ID。我正用头撞墙,试图弄清楚为什么 CONTAINS(Filters, '5') 没有返回任何记录。 是的。在我的情况下,停止列表无关紧要。按照您的建议将其关闭。

以上是关于sql 全文搜索 CONTAINS() *有时* 没有结果的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 全文搜索 CONTAINS() 是不是容易受到 SQL 注入的攻击?

使用联接的 SQL Server 全文搜索无法按预期工作

SQL 2008 全文搜索词邻近度

SQL Server 全文搜索返回意外结果

SQL Server 2012 安装或添加全文搜索

全文搜索中的 CONTAINS 不返回所有结果