【问题标题】:SQL 2005 Full-Text-Search: How to default all user search words to a CONTAINS NEAR type FTS searchSQL 2005 全文搜索:如何将所有用户搜索词默认为 CONTAINS NEAR 类型 FTS 搜索
【发布时间】:2011-01-10 11:55:33
【问题描述】:

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

我希望用户搜索要在 CONTAINS 搜索中使用的一个或多个单词,用 NEAR 分隔他们在文本框中键入的每个单词。我是一名新开发人员,不知道该怎么做,或者是否已经有一个内置函数可以解决这个问题。

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

选择 BookID、书名 来自 tblBooks WHERE CONTAINS(书名,'Sawyer NEAR Tom')

然后返回:

12032 汤姆索亚历险记

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

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

选择 BookID、书名 来自 tblBooks WHERE CONTAINS(书名,'Sawyer')

返回:

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

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

选择 BookID、书名 来自 tblBooks 哪里包含(书名,@Search)

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

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

-大卫

【问题讨论】:

    标签: sql contains full-text-search


    【解决方案1】:

    首先,您需要将输入的@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
    

    【讨论】:

      猜你喜欢
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多