#sql-server #full-text-search
#sql-сервер #полнотекстовый поиск
Вопрос:
У меня есть запрос, аналогичный следующему, для возврата статей, соответствующих результатам полнотекстового поиска. В рабочей среде текст [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)
использует результаты повторно. Есть ли какой-либо способ написать тот же запрос, не прибегая к обработке результатов?
Ответ №1:
Похоже, что правильный ответ на этот вопрос — использовать CONTAINSTABLE
, который работает аналогично CONTAINS
, но возвращает таблицу вместо логического 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