Sql server 2008 使用containstable和freetext进行相关性排序搜索
我已经读到,您可以使用containstable以及SQL 2008 server下的contains和freetext对搜索结果进行排名。我最近才第一次使用freetext。自由文本分别循环遍历单词,并与索引列进行比较。我想能够搜索短语,然后单一的单词 假设描述列已编制索引。我使用的存储过程查询如下:Sql server 2008 使用containstable和freetext进行相关性排序搜索,sql-server-2008,stored-procedures,full-text-search,Sql Server 2008,Stored Procedures,Full Text Search,我已经读到,您可以使用containstable以及SQL 2008 server下的contains和freetext对搜索结果进行排名。我最近才第一次使用freetext。自由文本分别循环遍历单词,并与索引列进行比较。我想能够搜索短语,然后单一的单词 假设描述列已编制索引。我使用的存储过程查询如下: SELECT id, description, item from table where (FREETEXT(description,@strsearch)) 示例:如果3个行集包含带有苹果
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
id1 McDonalds fast food
id2 healthy food
id3 fast food restaurant
id4 Italian restaurant
示例:如果4个行集包含包含包含食物的单词,并且我搜索“快餐店”,则带有id3的行集应位于第一位,后跟id1(不是完全匹配,但因为列中有“快餐”),然后其他两个应位于第二位:
id1 apple pie 4/01/2012
id2 apple cake 2/29/2011
id3 candy apple 5/9/2011
id1 McDonalds fast food
id2 healthy food
id3 fast food restaurant
id4 Italian restaurant
这篇文章有用吗 这在一定程度上意味着,使用一个附加参数将允许您将结果限制为具有最大相关性的结果(您可以使用
权重
)并按该相关性排序(排名
)
top_n_by_rank是一个整数值n,它指定只有n
排名最高的匹配项将按降序返回
文档中没有自由文本的示例
;它只引用CONTAINSTABLE
。但它肯定意味着CONTAINSTABLE
输出一个RANK
列,您可以使用它来按
排序
我不知道是否有任何方法可以强化你自己对相关性的定义。根据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
结果:
id description
-- -----------
3 fast food restaurant
1 McDonalds fast food
2 healthy food
4 Italian restaurant
这篇文章有用吗 这在一定程度上意味着,使用一个附加参数将允许您将结果限制为具有最大相关性的结果(您可以使用
权重
)并按该相关性排序(排名
)
top_n_by_rank是一个整数值n,它指定只有n
排名最高的匹配项将按降序返回
文档中没有自由文本的示例
;它只引用CONTAINSTABLE
。但它肯定意味着CONTAINSTABLE
输出一个RANK
列,您可以使用它来按
排序
我不知道是否有任何方法可以强化你自己对相关性的定义。根据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
结果:
id description
-- -----------
3 fast food restaurant
1 McDonalds fast food
2 healthy food
4 Italian restaurant
非常感谢。从MSDN页面和您的代码中,您为我指出了正确的方向。然后我发现有点困惑,但还是解决了it@Aaron,使用2条select语句的目的是什么。如果我注释掉外部select语句并将ORDERBY子句转换为内部select语句,我会得到相同的结果。非常感谢。从MSDN页面和您的代码中,您为我指出了正确的方向。然后我发现有点困惑,但还是解决了it@Aaron,使用2条select语句的目的是什么。如果注释掉外部select语句并将ORDERBY子句转换为内部select语句,则得到相同的结果。