SQL全文搜索更改结果顺序

时间:2016-12-20 09:24:32

标签: sql sql-server full-text-search sql-server-2014 rank

我使用完整搜索文字来实现搜索功能。基本上我将不得不用搜索字符串搜索所有列。搜索字符串将包含来自不同列的值的组合。但是我不知道我将要搜索的所有列。 例如,在全文SQL搜索中使用以下查询来查找基于姓氏,地址和邮编的客户

DECLARE @SearchString VARCHAR(200)
SET @SearchString = 'Adam OR West OR 60608'

SELECT Id, First_Name, Last_Name, Address,City,State,Zip, Rank
FROM Patient_Ex PAT 
    INNER JOIN CONTAINSTABLE(Patient_Ex,*, @SearchString) CT 
        ON PAT.Id = CT.[Key]

我得到了以下结果。

Id  FirstName   LastName    Address City    State   Zip RankID
25  Adam Avenue Adam     North Albay Avenue Chicago IL  60619   272
26  Adam Avenue West    South Escaaba Avenue    Chicago IL  60620   272
27  Adam Avenue Adam     eclaire Avenue Chicago IL  60634   272
28  Adam Avenue West    Leamington Avenue   Chicago IL  60657   272
29  Adam Avenue Adam    North England Avenue    Chicago IL  60660   272
30  Adam Avenue West    West 59th Street    Chicago IL  60608   272
31  Adam Avenue Adam    West 21st Place Chicago IL  60608   272
32  Adam Avenue West    South Albay Avenue  Chicago IL  60655   272

但是,我期待结果如下所示。如果同一行具有匹配的所有三个搜索条件,我希望它显示在顶部。在这种情况下,具有姓氏为Adam,包含West和Zip 60608的地址的记录应显示为最高记录。

Id  FirstName   LastName    Address City    State   Zip RankID
30  Adam Avenue Adam    West 59th Street    Chicago IL  60608   272
31  Adam Avenue West    West 21st Place Chicago IL  60608   272
27  Adam Avenue Adam    eclaire Avenue  Chicago IL  60634   272
28  Adam Avenue West    Leamington Avenue   Chicago IL  60657   272
29  Adam Avenue Adam    North England Avenue    Chicago IL  60660   272
25  Adam Avenue West    North Albany Avenue Chicago IL  60619   272
26  Adam Avenue Adam    South Escanaba Avenue   Chicago IL  60620   272
32  Adam Avenue West    South California Avenue Chicago IL  60655   272

如何修改查询以获得与上述结果类似的结果。

谢谢, 桑沙

1 个答案:

答案 0 :(得分:0)

你需要在这里使用条件ORDER BY:

DECLARE @SearchString VARCHAR(200)
SET @SearchString = 'Adam OR West OR 60608'

SELECT Id, First_Name, Last_Name, Address,City,State,Zip, Rank
FROM Patient_Ex PAT 
    INNER JOIN CONTAINSTABLE(Patient_Ex,*, @SearchString) CT 
        ON PAT.Id = CT.[Key]
ORDER BY 
  CASE WHEN (Last_Name='Adam' AND Address like '%West%' AND Zip = '60608') THEN 0 ELSE 1 END,
  CT.Rank DESC

上述查询将放置Last_Name = Adam的记录,地址包含结果集顶部的“West”和Zip = 60608。其余记录将按照CONTAINSTABLE返回的全文搜索排序排序,排名最高的记录位于顶部,但恰好在符合上述3个标准的记录之后。

您说您不知道要搜索哪些列。看看你是否可以使用上面的代码片段作为创建动态SQL的基础,动态SQL将在特定搜索案例中使用的列上运行。

HTH