2011-10-06 37 views
3

使用SQL Server 2005全文搜索我想返回该搜索的最大相关结果百分比内的值。在列的最大值的百分比内返回行

SELECT 
A.ActivityID, 
KEY_TBL.Rank as Relevance, 
DENSE_RANK() OVER (ORDER BY Rank DESC) as SearchRank 
FROM Activity A 
INNER JOIN FREETEXTTABLE(vwActivitySearch, FTS,'My search expression') AS KEY_TBL ON A.ActivityID = KEY_TBL.[KEY] 

回报:

ActivityID Relevance SearchRank 
    ----------- ----------- -------------------- 
    89378  242   1 
    89406  242   1 
    88083  236   2 
    88214  236   2 
    84007  197   3 
    83434  197   3 
    13017  172   4 
    89247  164   5 
    89346  164   5 

而不是按职级的回报,我想在这个例子中返回大于90%,或一些任意百分比值,最高的相关性,所以

WHERE Relevance>(242*0.9). 

我确信有一个简单的方法来实现这一点,但我看不到它。

一些约束 -

  • 该查询是一个UDF内的CTE的表达。
  • 我可以很容易地运行初始查询来获得@ MAXRelevance = SELECT MAX(Relevance)...然后在WHERE子句中使用Max(Relevance),但是全文搜索并不保证为相关结果返回相同的绝对值重复搜索。

现有功能:

CREATE FUNCTION [dbo].[xxActivitySearch] (@SearchTerm varchar(255)='',@ResultDepth int) 
RETURNS @ReturnTable Table (ActivityID int,Relevance int,SearchRank int) 
AS 
BEGIN 
WITH T AS (
SELECT 
    A.ActivityID, 
    KEY_TBL.Rank as Relevance, 
    DENSE_RANK() OVER (ORDER BY Rank DESC) as SearchRank 
FROM Activity A 
INNER JOIN FREETEXTTABLE(vwActivitySearch, FTS,@SearchTerm) AS KEY_TBL ON A.ActivityID=KEY_TBL.[KEY]) 
INSERT @ReturnTable SELECT * FROM T WHERE (SearchRank<[email protected]) 
RETURN 
END 
+0

无法添加第二个CTE,会做SELECT ActivityID,Relevence,SearchRank FROM FirstCTE WHERE Relevence>(242 * 0.9),并用其作为主查询的CTE? –

+0

好点Wayne,这帮助我重新关注这一点。因此,我现在通过做类似的事情来解决眼前的问题。但是我仍然认为应该有一些方法可以在单个查询中实现这一点,而我只是错过了一个技巧。展望未来的项目,我怀疑新的SQL Server Denali'分析函数'http://msdn.microsoft.com/en-us/library/hh213234(v=SQL.110).aspx将是一个很大的帮助问题类型。 – Identic

+0

我确定也有。我会继续做一些研究,因为我有兴趣解决类似的挑战。 –

回答

2
WITH T AS 
(
SELECT A.ActivityID, 
     KEY_TBL.Rank       as Relevance, 
     DENSE_RANK() OVER (ORDER BY Rank DESC) as SearchRank, 
     MAX(KEY_TBL.Rank) OVER() AS MaxRelevance 
FROM Activity A 
     INNER JOIN 
     FREETEXTTABLE(vwActivitySearch, FTS, 'My search expression') AS KEY_TBL 
     ON A.ActivityID = KEY_TBL.[KEY] 

) 
SELECT ActivityID, 
     Relevance, 
     SearchRank 
FROM T 
WHERE Relevance>(MaxRelevance*0.9) 
+0

正是我期待的答案! – Identic

+0

+1,用于处理模糊逻辑的grt解决方案...好吗?也+1 – Shubhojit