views:

129

answers:

1

I'm have some trouble with the fulltext CONTAINS operator. Here's a quick script to show what I'm doing. Note that the WAITFOR line simply gives the fulltext index a moment to finish filling up.

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

The result set returned is:

1   dog
2   dogbreed
3   dogbreedinfo
4   dogs

Why is record #7 'breeddogs' not returned?

EDIT

Is there another way I should be searching for strings that are contained in other strings? A way that is faster than LIKE '%searchword%' ?

+1  A: 

Just because MS Full-Text search does not support suffix search - only prefix, i.e. '* ' in front of '*dog *' is simply ignored. It is clearly stated in Books Online btw.

CONTAINS can search for:

  • A word or phrase.
  • The prefix of a word or phrase.
  • A word near another word.
  • A word inflectionally generated from another (for example, the word drive is the inflectional stem of drives, drove, driving, and driven).
  • A word that is a synonym of another word using a thesaurus (for example, the word metal can have synonyms such as aluminum and steel).

Where prefix term is defined like this:

< prefix term > ::= { "word *" | "phrase *" }

So, unfortunately: there's no way to issue a LIKE search in fulltext search.

AlexS
So how do I match strings that have the search string within the target string?
Nathan Ridley
Well that's kind of restrictive. If I have a table with masses of text, how do I search for buried strings?
Nathan Ridley
You should either use 'standard' methods (LIKE, CHARINDEX, etc.) or switch to Lucene which can be configured to support the functionality you need.
AlexS
I'll have to use LIKE for now and look at getting Lucene set up. Thanks for the answer.
Nathan Ridley