2015-08-20 39 views
2

我有一张表,其中有一列是nvarchar类型的列。该表可以增长到具有相当大数量的条目。可以在这个特定的列上执行搜索,以便在GUI实现的存储过程中查找所有匹配项。在那个检查字符串匹配的sp逻辑中,在该特定列上使用LIKE%entered_phrase%。 现在,由于这可能效率不高,我想对该特定列使用全文搜索。全文搜索表中的一列

CREATE UNIQUE INDEX ui_MyId ON MyTable(Id); 
CREATE FULLTEXT CATALOG ft_mycatalog AS DEFAULT; 
CREATE FULLTEXT INDEX ON MyTable(MyColumn) 
KEY INDEX ui_MyId 
WITH STOPLIST = SYSTEM; 

然而,当我执行:返回

select * FROM MyTable 
WHERE CONTAINS(MyColumn, 'some_term') 

没有记录。我做错了什么? (同样的事情LIKE,当然,作品)

Id MyColumn 
1 12345some_termwsdjf4sd 
2 sdfsjdsfsdfsdfsdsome_term5dgd 
3 4l00lko0dfsdfsome_term 

所以应该归还所有3项。当然在这张桌子上有更多的专栏,但现在他们无关紧要。

+1

您能澄清一下列名吗? (“MyColumn”vs“Value”) –

+0

您按列MyColumn创建索引并按列进行搜索值Value – Backs

+0

Ah,它是拼写错误,Value是MyColumn的名称,所以是: SELECT * FROM MyTable WHERE CONTAINS(MyColumn, 'some_term') – bojanaborkovic

回答

0

据我所知'Contains'只有在单词与作为搜索关键字提供的特定单词相匹配时才会返回 - 未部分匹配。然而,你可以强制“包含”要返回的有话开始与特定搜索键,像这个例子的结果

select * FROM MyTable 
WHERE CONTAINS(MyColumn, '"some*"') 

它会给你这有话开始“一些”在MyColumn的结果。 这里是Technet link

我的建议是使用'喜欢'而不是'包含'。

+0

是的,最好使用LIKE或PATINDEX。但事实证明,我发现存储过程执行的扫描次数更多,并不是因为特定的行(使用LIKE搜索),而是因为其中有一些有效的连接。 – bojanaborkovic