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() *有时* 没有结果的主要内容,如果未能解决你的问题,请参考以下文章