Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 使用containstable和freetext进行相关性排序搜索_Sql Server 2008_Stored Procedures_Full Text Search - Fatal编程技术网

Sql server 2008 使用containstable和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个行集包含带有苹果

我已经读到,您可以使用containstable以及SQL 2008 server下的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
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语句,则得到相同的结果。