【问题标题】:SQL Full Text Search Changing the result OrderSQL全文搜索更改结果顺序
【发布时间】:2016-12-20 09:24:31
【问题描述】:

我正在使用完整搜索文本来实现搜索功能。基本上我将不得不使用搜索字符串对所有列进行搜索。搜索字符串将具有来自不同列的值的组合。但是,我不知道我必须搜索哪些列。 例如,在全文 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

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

谢谢, 桑塔

【问题讨论】:

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


    【解决方案1】:

    您需要在这里使用条件 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、Address 包含单词“West”且 Zip=60608 的记录放在结果集的顶部。其余记录将按照 CONTAINSTABLE 返回的全文搜索排名进行排序,排名最高的记录在顶部,但紧接在符合上述 3 个条件的记录之后。

    您说您不知道必须搜索哪些列。看看您是否可以使用上面的代码 sn-p 作为创建动态 SQL 的基础,该 SQL 将对特定搜索案例中使用的列进行操作。

    HTH

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      相关资源
      最近更新 更多