2010-01-28 2 views
1

J'ai une page Web asp.net avec une zone de texte de recherche simple qui renvoie les lignes correspondantes d'une base de données MSSQL 2005. Il utilise actuellement une instruction LIKE pour ramener les correspondances, mais force l'utilisateur à taper une phrase exacte. Les utilisateurs veulent plus d'expérience de recherche sur Google et j'ai donc décidé de configurer et d'indexer les tables nécessaires avec FTS. Je voudrais que les utilisateurs recherchent le mot ou les mots à utiliser dans une recherche CONTAINS avec NEAR séparant chaque mot qu'ils tapent dans la zone de texte. Je suis un nouveau développeur et je ne sais pas comment le faire, ou s'il existe déjà une fonction intégrée pour couvrir cela.SQL 2005 Full-Text-Search: Comment par défaut tous les mots de recherche d'utilisateur à un CONTAINS NEAR type FTS recherche

Ainsi, par exemple, si un utilisateur tape "Sawyer Tom" dans la zone de recherche de la requête devrait fonctionner comme ceci:

SELECT BookID, BookTitle DE tblBooks OU contains (BookTitle, Sawyer de Tom ')

Et retour:

12032 les Aventures de Tom Sawyer

actuellement en utilisant la déclaration comme je l'ai maintenant la recherche de l'utilisateur ne trouvera pas de correspondance.

Si l'utilisateur tape simplement Sawyer la requête devrait fonctionner tout simplement comme ceci:

SELECT BookID, BookTitle DE tblBooks OU contains (BookTitle, 'Sawyer')

retour:

12032 Les aventures de Tom Sawyer 72192 Buz Sawyer de Roy Crane: La guerre dans le Pacifique (Vol.1)

Mon code actuel vient de se brancher il recherche chaîne dans la requête comme ceci:

SELECT BookID, BookTitle DE tblBooks OU contains (BOOKTITLE, @Search)

Ce qui ne fonctionne évidemment pas. Comment puis-je séparer chaque mot automatiquement avec NEAR?

Merci beaucoup d'avance pour toute aide que vous pouvez fournir!

-David

Répondre

0

Tout d'abord, vous devez diviser votre entrée variable @Search en mots.

Voici un blog avec une UDF qui accomplira que:

T-SQL to Split a varchar into Words

Ensuite, vous regardez à travers chaque mot est revenu, et concaténer chaque mot avec une requête NEAR.

Quelque chose comme ceci:

declare @words as TABLE(wordNum int identity primary key, word nvarchar(max)) 

insert into @words select [value] from dbo.SplitWords('my dog has fleas') 

declare @wordCount int 
select @wordCount = COUNT(*) from @words 

declare @searchString nvarchar(max) 
set @searchString = '' 

declare @thisWord nvarchar(max) 
set @thisWord = '' 

declare @i int 
set @i = 1 
WHILE @i <= @wordCount 
BEGIN 
    select @thisWord = word from @words where wordNum = @i 
    if @i = @wordCount 
     select @searchString = @searchString + @thisWord 
    else 
     select @searchString = @searchString + @thisWord + ' NEAR ' 
    SET @i = @i + 1 
END 
Questions connexes