我正在使用以下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
感谢。
答案 0 :(得分:1)
我真的不是FTS的专家,但希望这有助于你开始。
首先,ROW_NUMBER
在SQL Server中需要OVER (ORDER BY xxx)
。即使您按照常量值告诉它,它仍然可能最终重新排列结果。所以,如果你依靠行号来处理你的分页,你就会遇到某种排序。
当我在FTS上挖掘“返回结果按排名排序”位时,我发现a couple articles描述按排名排序。简而言之,他们说RANK
是CONTAINSTABLE
明确返回的列。因此,如果您无法找到从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 为基础限制结果。也许这对你也有用。