2011-06-11 9 views
6

Tengo una consulta similar a la siguiente para devolver artículos que coincidan con una búsqueda de texto completo. En producción, el texto [FULL TEXT SEARCH CRITERIA] se reemplaza por la expresión de búsqueda de texto completo real.¿Devuelve la página de resultados de búsqueda de texto sin recurrir?

La consulta está escrita para mostrar solo una página de resultados.

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 

Esto funciona bien, excepto que la búsqueda de texto completo devuelve los resultados en orden de relevancia, pero ROW_NUMBER() OVER (ORDER BY ArtViews DESC) estaciones de los resultados. ¿Hay alguna forma de escribir la misma consulta sin recurrir a los resultados?

Respuesta

1

Parece que la respuesta correcta a esto es usar CONTAINSTABLE, que funciona de manera similar a CONTAINS pero devuelve una tabla en lugar de una condición booleana WHERE.

Así que termino con algo como esto en su lugar.

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 
Cuestiones relacionadas