我已经读过你可以使用containsstable以及SQL 2008服务器下的contains和freetext对搜索结果进行排名。我刚刚第一次使用freetext。自由文本单独循环显示单词并与索引列进行比较。我希望能够先搜索短语然后搜索单个单词。
假设说明列已编入索引。我正在使用这样的存储过程查询:
SELECT id, description, item from table where (FREETEXT(description,@strsearch))
示例如果3个行集包含带有苹果的单词并且我搜索“apple cake”,则id2的行集应该是第一个,然后其他两个应该是:
id1 apple pie 4/01/2012
id2 apple cake 2/29/2011
id3 candy apple 5/9/2011
示例如果4个行集包含带有食物的单词并且我搜索“快餐店”,则id3的行集应该是第一个,然后是id1(不是完全匹配,但因为它有“快餐”)列),然后其他两个应该遵循:
id1 McDonalds fast food
id2 healthy food
id3 fast food restaurant
id4 Italian restaurant
答案 0 :(得分:1)
这篇文章有帮助吗?
MSDN : Limiting Ranked Result Sets (Full-Text Search)
这部分意味着,使用附加参数可以将结果限制为具有最大相关性的结果(您可以使用WEIGHT
进行影响)并按相关性排序{{1 }})。
top_n_by_rank是一个整数值n,它指定只有n 排名最高的比赛将按降序返回。
该文档没有RANK
的示例;它只引用FREETEXT
。但它绝对意味着CONTAINSTABLE
输出了CONTAINSTABLE
列,您可以将其用于RANK
。
我不知道是否有任何方法可以强制执行您自己的相关性定义。根据FTS拉出前10个相关比赛可能是有意义的,然后在输出上应用您自己的排名,例如您可以使用函数拆分搜索项,并按匹配的字数排序。为了简单起见,在下面的例子中我很容易重复,我在子查询中没有使用全文,但你可以用你实际做的任何东西替换它。首先创建函数:
ORDER BY
然后是一个简单的脚本,显示如何执行匹配:
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];