這篇文章有幫助嗎?
MSDN : Limiting Ranked Result Sets (Full-Text Search)
這意味着,在某種程度上,使用一個額外的參數,可以讓你的結果限制爲與最相關的那些(你可以影響使用WEIGHT
),也爲了通過相關性(RANK
)。
top_n_by_rank是一個整數值n,指定只有最高排名的匹配纔會按降序返回。
該文檔沒有示例FREETEXT
;它只引用CONTAINSTABLE
。但它肯定意味着CONTAINSTABLE
輸出RANK
列,您可以使用ORDER BY
。
我不知道是否有任何方法來執行您自己的定義的相關性。根據FTS排出前10位相關的匹配可能是有意義的,然後在輸出上應用您自己的排名,例如,你可以使用一個函數分割搜索條件,並按照匹配的詞數來排序。在下面的例子中,爲了簡單和容易複製,我沒有在子查詢中使用Full-Text,但可以將它替換爲您實際正在做的任何事情。首先創建功能:
IF OBJECT_ID('dbo.SplitStrings') IS NOT NULL
DROP FUNCTION dbo.SplitStrings;
GO
CREATE FUNCTION dbo.SplitStrings(@List NVARCHAR(MAX))
RETURNS TABLE
AS
RETURN (SELECT Item FROM
(SELECT Item = x.i.value('(./text())[1]', 'nvarchar(max)')
FROM (SELECT [XML] = CONVERT(XML, '<i>'
+ REPLACE(@List, ' ', '</i><i>') + '</i>').query('.')
) AS a CROSS APPLY [XML].nodes('i') AS x(i)) AS y
WHERE Item IS NOT NULL
);
GO
然後一個簡單的腳本顯示瞭如何進行匹配:
DECLARE @foo TABLE
(
id INT,
[description] NVARCHAR(450)
);
INSERT @foo VALUES
(1,N'McDonalds fast food'),
(2,N'healthy food'),
(3,N'fast food restaurant'),
(4,N'Italian restaurant'),
(5,N'Spike''s Junkyard Dogs');
DECLARE @searchstring NVARCHAR(255) = N'fast food restaurant';
SELECT x.id, x.[description]--, MatchCount = COUNT(s.Item)
FROM
(
SELECT f.id, f.[description]
FROM @foo AS f
-- pretend this actually does full-text search:
--where (FREETEXT(description,@strsearch))
-- and ignore how I actually matched:
INNER JOIN dbo.SplitStrings(@searchstring) AS s
ON CHARINDEX(s.Item, f.[description]) > 0
GROUP BY f.id, f.[description]
) AS x
INNER JOIN dbo.SplitStrings(@searchstring) AS s
ON CHARINDEX(s.Item, x.[description]) > 0
GROUP BY x.id, x.[description]
ORDER BY COUNT(s.Item) DESC, [description];
結果:
id description
-- -----------
3 fast food restaurant
1 McDonalds fast food
2 healthy food
4 Italian restaurant
非常感謝。從MSDN頁面和您的代碼中,您指出了正確的方向。然後我發現http://msdn.microsoft.com/en-us/library/aa172823%28v=sql.80%29.aspx有點混淆,但通過它工作 – Patriotec 2012-04-29 13:40:05
@Aaron,使用2選擇的目的是什麼聲明。如果我註釋掉外部select語句並將order by子句移至內部select語句,我會得到相同的結果。 – iMatoria 2012-08-19 06:31:47