2010-05-26 74 views
2

如果在特定列中找到搜索词,我应该如何将更高的排名应用于搜索结果?SQL Server - 全文权重/根据匹配的列排名

例如,如果搜索项是“国王”,并且它在“姓氏”中找到,我希望它的排名高于它在地址中显示为“景街”的一部分。

我如何做到这一点?

回答

0

检查2008年联机丛书CONTAINSTABLE

您可以将column_name/column_list参数与weight_value结合使用来实现所需的结果。

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

0

你可以尝试用公共表表达式和工会多个全文查询缝的东西放在一起:

-- 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。添加运算符的使用也使得两列中的结果的行数是来自仅一列的结果的权重的两倍。您可能希望使用某种归一化和平均值来组合加权排名。