2010-03-06 28 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