想要避免排序全文搜索结果

时间:2010-12-08 18:39:36

标签: sql-server full-text-search

我正在使用以下SQL Server查询,该查询搜索全文索引并且似乎正常工作。还包括一些额外的工作,因此查询适用于分页。

但是,我的理解是全文搜索返回根据排名排序的结果,这将是不错的。

但如果我删除顶部附近的OVER子句,我会收到错误。任何人都可以告诉我如何修改此查询以取消结果吗?

DECLARE @StartRow int;
DECLARE @MaxRows int;

SET @StartRow = 0;
SET @MaxRows = 10;

WITH ArtTemp AS
(SELECT TOP (@StartRow + @MaxRows) ROW_NUMBER() OVER (ORDER BY ArtViews DESC) AS RowID,
Article.ArtID,Article.ArtTitle,Article.ArtSlug,Category.CatID,Category.CatTitle,
Article.ArtDescription,Article.ArtCreated,Article.ArtUpdated,Article.ArtUserID,
[User].UsrDisplayName AS UserName
FROM Article
INNER JOIN Subcategory ON Article.ArtSubcategoryID = Subcategory.SubID
INNER JOIN Category ON Subcategory.SubCatID = Category.CatID
INNER JOIN [User] ON Article.ArtUserID = [User].UsrID
WHERE CONTAINS(Article.*,'FORMSOF(INFLECTIONAL,"htmltag")'))

SELECT ArtID,ArtTitle,ArtSlug,CatID,CatTitle,ArtDescription,ArtCreated,ArtUpdated,
ArtUserID,UserName
FROM ArtTemp
WHERE RowID BETWEEN @StartRow + 1 AND (@StartRow + @MaxRows)
ORDER BY RowID

感谢。

1 个答案:

答案 0 :(得分:1)

我真的不是FTS的专家,但希望这有助于你开始。

首先,ROW_NUMBER在SQL Server中需要OVER (ORDER BY xxx)。即使您按照常量值告诉它,它仍然可能最终重新排列结果。所以,如果你依靠行号来处理你的分页,你就会遇到某种排序。

当我在FTS上挖掘“返回结果按排名排序”位时,我发现a couple articles描述按排名排序。简而言之,他们说RANKCONTAINSTABLE明确返回的列。因此,如果您无法找到从CONTAINS挖出结果排名的方法,您可以尝试加入CONTAINSTABLE,并明确使用RANK列作为您的订单{ {1}}。示例(语法可能稍微偏离):

ROW_NUMBER

最终结果是你仍在排序,但你的排名是这样做的。

此外,MSDN页面表明SELECT TOP (@StartRow + @MaxRows) ROW_NUMBER() OVER (ORDER BY MyFTS.RANK DESC) AS RowID, Article.ArtID,Article.ArtTitle,Article.ArtSlug,Category.CatID,Category.CatTitle, Article.ArtDescription,Article.ArtCreated,Article.ArtUpdated,Article.ArtUserID, [User].UsrDisplayName AS UserName FROM Article INNER JOIN Subcategory ON Article.ArtSubcategoryID = Subcategory.SubID INNER JOIN Category ON Subcategory.SubCatID = Category.CatID INNER JOIN [User] ON Article.ArtUserID = [User].UsrID INNER JOIN CONTAINSTABLE(Article, *, 'FORMSOF(INFLECTIONAL,"htmltag")') AS MyFTS 还能够以TOP N 为基础限制结果。也许这对你也有用。