2011-10-06 35 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