sql-server - 无需重新排序即可返回全文搜索结果页面?

标签 sql-server full-text-search

我有一个类似于以下内容的查询,用于返回与全文搜索匹配的文章。在生产中,文本[FULL TEXT SEARCH CRITERIA] 被替换为实际的全文搜索表达式。

编写的查询仅返回一页结果。

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 [FULL TEXT SEARCH CRITERIA] AND Article.ArtApproved = 1
)

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

这工作正常,只是全文搜索按相关顺序返回结果,但 ROW_NUMBER() OVER (ORDER BY ArtViews DESC) 对结果进行排序。有没有办法在不使用结果的情况下编写相同的查询?

最佳答案

看起来正确的答案是使用 CONTAINSTABLE,它的工作方式与 CONTAINS 类似,但返回一个表而不是 bool 值 WHERE > 条件。

所以我最终得到了这样的结果。

WITH ArtTemp AS (
  SELECT TOP (@StartRow + @MaxRows) ROW_NUMBER() OVER (ORDER BY FTS.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, abc)') AS FTS ON Article.ArtID = FTS.[KEY]
  WHERE Article.ArtApproved = 1
)

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

关于sql-server - 无需重新排序即可返回全文搜索结果页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6314502/

相关文章:

sql-server - SQL Server 的开发版是否允许您拥有多个用户?

SQLite 虚拟表匹配转义字符

在 where 中使用全文而不是 order by

mysql - 带有 SphinxSE 的 MariaDB 10.0

sql-server - 使用 OFFSET-FETCH,如何将行数默认为 "all rows"?

sql-server - 如何增加bcp批量负载?

node.js - 从 nodeJS 连接到 SQL Server 的问题

java - Elasticsearch 优先考虑从匹配开始

caching - 按 Redis 缓存中的值搜索 - 二级索引

sql - 跟踪单个 SQL Server 数据库的所有登录