这篇文章有帮助吗?
MSDN:限制排名结果集(全文搜索)
这在某种程度上意味着,使用附加参数将允许您将结果限制为具有最大相关性的结果(您可以使用 来影响WEIGHT
),并按该相关性 ( RANK
) 进行排序。
top_n_by_rank 是一个整数值 n,它指定仅返回 n 个排名最高的匹配项,按降序排列。
该文档没有示例FREETEXT
;它只引用CONTAINSTABLE
. 但这绝对意味着CONTAINSTABLE
输出一个RANK
您可以使用的列ORDER BY
。
我不知道是否有任何方法可以强制执行您自己的相关性定义。根据 FTS 提取前 10 个相关匹配项,然后在输出中应用您自己的排名可能是有意义的,例如,您可以使用函数拆分搜索词,并按匹配词的数量排序。为简单起见,在以下示例中,我没有在子查询中使用全文,但您可以将其替换为您实际正在做的任何事情。首先创建函数:
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