2010-03-06 56 views
4

我对全文CONTAINS运算符有些问题。这里有一个快速的脚本来展示我在做什么。请注意,WAITFOR行只是给全文索引一分钟完成填充。我的全文搜索查询有什么问题?

create table test1 (id int constraint pk primary key, string nvarchar(100) not null); 
insert into test1 values (1, 'dog') 
insert into test1 values (2, 'dogbreed') 
insert into test1 values (3, 'dogbreedinfo') 
insert into test1 values (4, 'dogs') 
insert into test1 values (5, 'breeds') 
insert into test1 values (6, 'breed') 
insert into test1 values (7, 'breeddogs') 

go 
create fulltext catalog cat1 
create fulltext index on test1 (string) key index pk on cat1 
waitfor delay '00:00:03' 
go 
select * from test1 where contains (string, '"*dog*"') 

go 
drop table test1 
drop fulltext catalog cat1 

返回的结果集为:

1 dog 
2 dogbreed 
3 dogbreedinfo 
4 dogs 

为什么记录#7 'breeddogs' 不回来了?

编辑

有另一种方式,我应该寻找那些包含在其他字符串的字符串?一种比LIKE'%searchword%'更快的方式?

回答

5

仅仅因为MS全文搜索不支持后缀搜索 - 只有前缀'*'在* dog *之前被忽略。它在Books Online顺便说明。

CONTAINS可以搜索:

  • 的词或短语。
  • 单词或短语的前缀。
  • 靠近另一个词的单词。
  • 从另一个角度产生的词(例如,drive这个词是驱动器的驱动,驱动,驱动和驱动的变形词)。
  • 单词是使用同义词库的另一个单词的同义词(例如,金属词可以具有铝和钢等同义词)。

如果前缀术语是这样定义的:

<前缀项> :: = { “字*” | “phrase *”}

因此,不幸的是:没有办法在全文搜索中发出LIKE搜索。

+0

那么如何匹配在目标字符串中包含搜索字符串的字符串呢? – 2010-03-06 11:52:19

+0

那是一种限制。如果我有一张有大量文字的桌子,我该如何搜索埋藏的琴弦? – 2010-03-06 11:59:19

+0

您应该使用'标准'方法(LIKE,CHARINDEX等)或切换到可以配置为支持所需功能的Lucene。 – AlexS 2010-03-06 12:11:10