SQL Server - 基于匹配列的全文权重/排名

时间:2010-05-26 20:16:42

标签: sql-server tsql full-text-search

如果在特定列中找到搜索词,如何对搜索结果应用更高的排名?

例如,如果搜索字词是“King”,并且在“LastName”中找到它,我希望它的排名高于它在地址中显示为“King Street”的一部分。

我该怎么做?

2 个答案:

答案 0 :(得分:0)

查看2008年图书在线 CONTAINSTABLE

您可以将column_name / column_list参数与weight_value结合使用,以获得所需的结果。

使用column_name将更多权重应用于LastName,将column_list应用于其他名称。

答案 1 :(得分:0)

您可以尝试使用公用表表达式和UNIONs进行多个全文查询,以便将事物拼接在一起:

-- define some CTEs
WITH
    -- full-text query on LastName
    FT_LastName([Key], [Rank]) AS (
        SELECT [Key], [Rank] FROM CONTAINSTABLE(Foo, (LastName), 'options', 100)
    ),
    -- full-text query on Address
    FT_Address([Key], [Rank]) AS (
        SELECT [Key], [Rank] FROM CONTAINSTABLE(Foo, (Address), 'options', 100)
    ),
    -- combine
    FT_ReweightedTemp([Key], [RankLastName], [RankAddress]) AS (
        SELECT [Key], [Rank], 0 FROM FT_LastName
        UNION ALL
        SELECT [Key], 0, [Rank] FROM FT_Address
    ),
    -- calculated weighted ranks
    FT_Reweighted([Key], [Rank]) AS (
       SELECT [Key], MAX([RankLastName]) * 2 + MAX([RankAddress]) * 1
       FROM FT_ReweightedTemp
       GROUP BY [Key]
    )    

-- carry on
SELECT ...
FROM FT_Reweighted
INNER JOIN ...
ORDER BY [Rank]

在这个例子中,我使用因子2:1对地址加权LastName。使用加法运算符还会使得两列中的结果行的结果仅为来自一列的结果的两倍。您可能希望使用某种规范化和平均来代替组合加权排名。