2010-01-28 84 views
1

我有一个带有简单搜索文本框的asp.net网页,该文本框从MSSQL 2005数据库返回匹配行。它目前使用LIKE语句来恢复匹配,但强制用户键入一个精确的短语。用户希望获得更多的Google搜索类型体验,因此我决定使用FTS设置和索引所需的表格。SQL 2005全文搜索:如何将所有用户搜索词默认为CONTAINS NEAR类型FTS搜索

我希望用户搜索单词或单词用于CONTAINS搜索中,并用NEAR将他们键入的每个单词分隔到文本框中。我是一名新开发人员,不知道如何执行此操作,或者是否已有内置函数来解决此问题。

因此,举例来说,如果用户键入 “索耶汤姆” 在搜索框中的查询应该是这样的功能:

SELECT的BookID,BOOKTITLE FROM tblBooks WHERE CONTAINS(BOOKTITLE,“索耶NEAR汤姆)

,并返回:

12032目前使用类似的语句我现在用户搜索将找不到匹配的的汤姆·索亚

冒险。

如果用户键入简单索耶查询应该简单的功能是这样的:

SELECT的BookID,BOOKTITLE FROM tblBooks WHERE CONTAINS(BOOKTITLE, '索亚')

返回:

12032汤姆索亚历险记 72192 Roy Crane的Buz Sawyer:太平洋战争(第1卷)

我现在的代码只是插在t他搜索字符串像这样的查询:

SELECT的BookID,BOOKTITLE FROM tblBooks WHERE CONTAINS(BOOKTITLE,@Search)

这显然是行不通的。如何将每个单词与NEAR自动分开?

非常感谢您提供的帮助!

-David

回答

0

首先,您需要将您输入的@Search变量拆分为单词。

这里有一个博客帖子有一个UDF,将完成的是:

T-SQL to Split a varchar into Words

接下来,你会期待通过每个字返回,并连接每一个字一个NEAR查询。

事情是这样的:

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