【发布时间】:2011-10-06 11:33:10
【问题描述】:
使用 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<=@ResultDepth)
RETURN
END
【问题讨论】:
-
您不能添加第二个 CTE 来执行 SELECT ActivityID, Relevence, SearchRank FROM FirstCTE WHERE Relevence > (242*0.9) 并将其用作主查询的 CTE 吗?
-
好点韦恩,这帮助我重新关注这一点。结果,我现在通过做一些非常相似的事情解决了眼前的问题。但是我仍然认为应该有一些方法可以在单个查询中实现这一点,而我只是错过了一个技巧。展望未来的项目,我怀疑新的 SQL Server Denali 'Analytical Functions' msdn.microsoft.com/en-us/library/hh213234(v=SQL.110).aspx 将对此类问题有很大帮助。
-
我相信也有。我将继续做一些研究,因为我有兴趣解决类似的挑战。
标签: sql-server sql-server-2005 full-text-search