SQL Server 2008 - 具有多个关键字和分页的全文搜索

时间:2011-10-15 03:40:20

标签: c# sql-server sql-server-2008 full-text-search

我不是数据库人(正如这个问题所示)。我正在尝试编写一个表值函数,我可以在我的ASP.NET Web应用程序中使用Linq To Sql。

假设我想搜索标题或摘要可能包含多个关键字的书籍(例如“澳大利亚历史”)。

我想一次显示x个结果,所以我需要能够告诉我的功能“跳过”并“获取”一定数量的记录。

某些图书可能会被标记为“已删除”。我不想退还这些。

这是我到目前为止所拥有的:

CREATE FUNCTION SearchBooks
(
    @keywords nvarchar(50),
    @skip int,
    @take int
)
RETURNS TABLE
AS
RETURN
(
  SELECT TOP (@take)
         ROW_NUMBER() OVER (ORDER BY MyFTS.RANK DESC) AS RowID,
         MyFTS.RANK as Relevance,
         [ID],
         [Title],
         [Summary]
    FROM [Book]
    JOIN CONTAINSTABLE ([Book], ([Title], [Summary]), @keywords, @take) AS MyFTS ON MyFTS.[KEY] = [Book].[ID]
   WHERE ([Book].[Deleted] = 0) 
     AND (MyFTS.[RowID] BETWEEN (@skip + 1) AND (@skip + @take))
ORDER BY MyFTS.RANK DESC
)

当我尝试创建此功能时,SSMS会给出错误“无效的列名'RowID'”。

我想我还需要获取匹配记录的总数,以便我可以设置分页?

我希望你们中的一位SQL大师可以指出我正确的方向。

2 个答案:

答案 0 :(得分:4)

您不能在WHERE子句中引用列别名 - 使用内联视图/派生表:

  SELECT x.rowid,
         x.relevance,
         x.id,
         x.title,
         x.summary
   FROM (SELECT TOP (@take)
                ROW_NUMBER() OVER (ORDER BY MyFTS.RANK DESC) AS RowID,
                MyFTS.RANK as Relevance,
                [ID],
                [Title],
                [Summary]
           FROM [Book] b
           JOIN CONTAINSTABLE ([Book], ([Title], [Summary]), @keywords, @take) AS MyFTS ON MyFTS.[KEY] = b.id
          WHERE b.[Deleted] = 0) AS x
    WHERE x.[RowID] BETWEEN (@skip + 1) AND (@skip + @take))
ORDER BY x.relevance DESC

答案 1 :(得分:1)

感谢OMG小马 - 这正是我所追求的。 我已经修改了这个函数,它也返回了匹配行的总数(TotalRows),现在我应该可以让分页工作了。

CREATE FUNCTION SearchBooks
(
    @keywords nvarchar(50),
    @skip int,
    @take int
)
RETURNS TABLE
AS
RETURN
(
    SELECT TOP (@take) * FROM 
    (
        SELECT TOP (@take)
            ROW_NUMBER() OVER (ORDER BY MyFTS.RANK DESC) AS RowID,
            COUNT(*) OVER(PARTITION BY 1) as TotalRows,
            MyFTS.RANK as Relevance,
            [ID],
            [Title],
            [Summary]
        FROM [Book] b
        JOIN CONTAINSTABLE ([Book], ([Title], [Summary]), @keywords, @take) AS MyFTS ON MyFTS.[KEY] = b.[ID]
        WHERE b.[Deleted] = 0
    ) AS x
    WHERE x.[RowID] BETWEEN (@skip + 1) AND (@skip + @take)
    ORDER BY x.relevance DESC
)