如何使用存储过程输入参数进行FULL-TEXT搜索

时间:2014-03-31 13:52:21

标签: stored-procedures full-text-search sql-server-2012

也许我错过了显而易见的事情,但我花了一整天的时间搜索和搜索,但运气不佳,无法解决这个问题。也许我使用的搜索字词不正确?从来没有,这就是我想要做的。

我有一个表格,上面有一个FULL-TEXT索引。当我运行以下内容时,我获得了预期的结果:

SELECT
    A.*,
    KEY_TBL.[Rank]
FROM
[dbo].[TableA] A
INNER JOIN
    CONTAINSTABLE([dbo].[TableA], *, 'Jon OR Smith'
    ,5
    ) AS KEY_TBL
    ON A.[Id] = KEY_TBL.[Key]
ORDER BY
    KEY_TBL.[Rank] DESC

没问题。然而,我想要做的是将'Jon OR Smith'(或最终用户搜索的任何其他短语)作为存储过程的输入参数传递给查询。但是,当我尝试以下操作时,我得不到任何结果:

declare @search_phrase VARCHAR;
set @search_phrase = 'Jon OR Smith'

SELECT
    A.*
    KEY_TBL.[Rank]
FROM
[dbo].[TableA] A
INNER JOIN
    CONTAINSTABLE([dbo].[TableA], *, @search_phrase
    ,5
    ) AS KEY_TBL
    ON A.[Id] = KEY_TBL.[Key]
ORDER BY
    KEY_TBL.[Rank] DESC

我忍不住觉得我在这里错过了明显的东西。我尝试过做SET @search_phrase = N'Jon OR Smith',但也没有结果。在SSMS中,我收到一条消息,指出“信息:全文搜索条件包含噪声字”。虽然我认为由于 OR 是一个停用词,我需要查询才能工作(不影响/关闭停用词)。我不禁觉得这应该是很多人想做/已经做过的事情,但我没有发现任何文章。

应该注意的是,搜索短语中可能有一个或多个单词,我会在将完成的搜索短语发送到存储过程之前进行预处理,以添加必要的“OR”。

有人能指出我出错的地方吗?

1 个答案:

答案 0 :(得分:1)

看起来像是我,发布这个问题的类似建议让我得到答案。对于遇到这个"奇怪"行为,你需要确保每个单词都是双引号。

declare @search_phrase VARCHAR(50);
set @search_phrase = N'"Jon" OR "Smith"'

SELECT
    A.*
    KEY_TBL.[Rank]
FROM
[dbo].[TableA] A
INNER JOIN
    CONTAINSTABLE([dbo].[TableA], *, @search_phrase
    ,5
    ) AS KEY_TBL
    ON A.[Id] = KEY_TBL.[Key]
ORDER BY
    KEY_TBL.[Rank] DESC