2011-07-06 30 views
12

如果我有以下的全文搜索查询:SQL Server全文搜索 - 加权某些列在其他

SELECT * 
FROM dbo.Product 
    INNER JOIN CONTAINSTABLE(Product, (Name, Description, ProductType), 'model') ct 
     ON ct.[Key] = Product.ProductID 

是否可以权衡正在搜索的列?

举例来说,我更关心出现在名称列比我做的 描述或ProductType列字模型。

当然,如果这个词是在所有3列,然后我希望它比排名,如果它只是在名称列更高。如果它只出现在名称中而只是在描述/产品类型中出现,是否有任何方法可以提高排名?

+0

[SQL Server的加权全文搜索(可能重复http://stackoverflow.com/questions/310425/sql-server-weighted-full-text-搜索) – user7116

回答

9

你可以做类似下面的查询。在这里,WeightedRank由个人比赛的等级乘以计算。注意:不幸的是我没有安装罗斯文所以我不能对此进行测试,所以看它更像是伪代码,让我知道,如果它不能正常工作。

declare @searchTerm varchar(50) = 'model'; 

SELECT 100 * coalesce(ct1.RANK, 0) + 
     10 * coalesce(ct2.RANK, 0) + 
     1 * coalesce(ct3.RANK, 0) as WeightedRank, 
     * 
    FROM dbo.Product 
      LEFT JOIN 
     CONTAINSTABLE(Product, Name, @searchTerm) ct1 ON ct.[Key] = Product.ProductID 
      LEFT JOIN 
     CONTAINSTABLE(Product, Description, @searchTerm) ct2 ON ct.[Key] = Product.ProductID 
      LEFT JOIN 
     CONTAINSTABLE(Product, ProductType, @searchTerm) ct3 ON ct.[Key] = Product.ProductID 
5

Pro Full-Text Search in SQL Server 2008Listing 3-25. Sample Column Rank-Multiplier Search

SELECT * 
FROM (
    SELECT Commentary_ID 
     ,SUM([Rank]) AS Rank 
    FROM (
     SELECT bc.Commentary_ID 
      ,c.[RANK] * 10 AS [Rank] 
     FROM FREETEXTTABLE(dbo.Contributor_Birth_Place, *, N'England') c 
     INNER JOIN dbo.Contributor_Book cb ON c.[KEY] = cb.Contributor_ID 
     INNER JOIN dbo.Book_Commentary bc ON cb.Book_ID = bc.Book_ID 

     UNION ALL 

     SELECT c.[KEY] 
      ,c.[RANK] * 5 
     FROM FREETEXTTABLE(dbo.Commentary, Commentary, N'England') c 

     UNION ALL 

     SELECT ac.[KEY] 
      ,ac.[RANK] 
     FROM FREETEXTTABLE(dbo.Commentary, Article_Content, N'England') ac 
     ) s 
    GROUP BY Commentary_ID 
    ) s1 
INNER JOIN dbo.Commentary c1 ON c1.Commentary_ID = s1.Commentary_ID 
ORDER BY [Rank] DESC;