Хотите избежать сортировки результатов полнотекстового поиска - PullRequest
1 голос
/ 08 декабря 2010

Я использую следующий запрос 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 Ответ

1 голос
/ 09 декабря 2010

Я действительно не эксперт в 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 . Может быть, это также будет полезно для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...