Я действительно не эксперт в FTS, но, надеюсь, это поможет вам начать.
Во-первых, ROW_NUMBER
требует OVER (ORDER BY xxx)
в SQL Server. Даже если вы скажете ему упорядочить по постоянному значению, оно все равно может изменить результаты. Так что, если вы используете нумерацию строк для разбивки на страницы, вы застряли в какой-то сортировке.
Когда я копаюсь в FTS для этого бита "возвращаемых результатов, отсортированных по рейтингу", я нахожу пару статей , которые описывают порядок по рангу В двух словах, они говорят, что RANK
- это столбец, явно возвращаемый CONTAINSTABLE
. Поэтому, если вы не можете найти способ вывести результаты с ранжированием CONTAINS
, вы можете вместо этого попытаться объединиться с CONTAINSTABLE
и явно использовать столбец RANK
в качестве порядка по значению с ROW_NUMBER
. Пример (синтаксис может быть немного выключен):
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
Конечным результатом является то, что вы все еще сортируете, но вы делаете это в своих рейтингах.
Кроме того, на странице MSDN говорится, что CONTAINSTABLE
имеет возможность ограничивать результаты также на основе TOP N . Может быть, это также будет полезно для вас.