1

我有一个带有简单搜索文本框的 asp.net 网页,它从 MSSQL 2005 数据库返回匹配的行。它目前正在使用 LIKE 语句来返回匹配项,但会强制用户输入准确的短语。用户想要更多 Google 搜索类型的体验,因此我决定使用 FTS 设置和索引所需的表。

我希望用户搜索要在 CONTAINS 搜索中使用的一个或多个单词,其中 NEAR 将他们输入到文本框中的每个单词分开。我是一名新开发人员,不知道如何做到这一点,或者是否已经有一个内置函数来解决这个问题。

因此,例如,如果用户在搜索框中键入“Sawyer Tom”,则查询的功能应如下所示:

从 tblBooks 中选择 BookID、BookTitle,其中包含(BookTitle,'Sawyer NEAR Tom')

并返回:

12032 汤姆索亚历险记

目前使用我现在拥有的类似语句,用户搜索将找不到匹配项。

如果用户只键入 Sawyer,则查询应该像这样简单地运行:

从 tblBooks 中选择 BookID,BookTitle,其中包含(BookTitle,'Sawyer')

返回:

12032 汤姆索亚历险记 72192 罗伊克兰的布兹索耶:太平洋战争(第 1 卷)

我当前的代码只是将搜索字符串插入到查询中,如下所示:

选择 BookID,BookTitle 从 tblBooks WHERE CONTAINS(BookTitle,@Search)

这显然行不通。如何使用 NEAR 自动分隔每个单词?

非常感谢您提供的任何帮助!

-大卫

4

1 回答 1

0

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

这是一篇带有 UDF 的博客文章,可以实现这一点:

T-SQL 将 varchar 拆分为单词

接下来,您将查看返回的每个单词,并将每个单词与 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
于 2010-01-28T17:23:50.540 回答