2010-12-08 4 views
1

전체 텍스트 인덱스를 검색하고 올바르게 작동하는 것처럼 보이는 다음 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

저는 FTS의 전문가는 아니지만 희망을 갖고 시작하면 도움이됩니다.

먼저 ROW_NUMBER은 SQL Server에 OVER (ORDER BY xxx)이 필요합니다. 상수 값으로 주문한다고해도 여전히 일 수 있습니다. 결과가 다시 정렬됩니다. 따라서 페이지 매김을 처리하기 위해 행 번호 매김에 의존한다면, 어떤 종류의 정렬이 필요합니다.

"순위 결과에 따라 정렬 된 결과 반환"에 대해 FTS를 살펴볼 때 순위에 따라 순서가 설명 된 a couplearticles이 있습니다. 한마디로 RANKCONTAINSTABLE에 의해 명시 적으로 반환 된 열이라고합니다. 따라서 CONTAINS의 결과를 찾아 낼 방법이 없다면 CONTAINSTABLE에 대한 합류를 시도하고 ROW_NUMBER으로 값을 기준으로 RANK 열을 명시 적으로 사용할 수 있습니다.

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 기준으로 결과를 제한 할 수있는 권한이 있다고 나와 있습니다. 어쩌면 이것은 또한 당신에게 유용 할 것입니다.

+0

감사합니다. 아마도 정확하고 올바른 답변입니다. 그러나 추가 조인과 열의 오버 헤드를 원하지는 않습니다. 또한 내가 가진 임시 테이블을 삭제 한 것으로 나타났습니다. 아마도 당신은 테스트를 위해 그것을했을 것입니까? 그것은 페이징 로직에 필요한 것 같습니다. –

+0

맞네요 - CTE 만 변경/표시했습니다. 페이징에는 모든 것이 필요합니다. 조인 오버 헤드는 테이블 너비와 인덱스에 따라 알지 못할 수도 있습니다. 두 옵션 모두 외부 FTS 엔진을 사용하여 DB를 공격하고 어쨌든 일종의 행별 처리를 되돌려 보내야합니다. 그리고 어떤 사람들은'CONTAINSTABLE'을 더 빨리 발견합니다. http://www.eggheadcafe.com/software/aspnet/29849015/contains-vs-containstable-performance.aspx – Matt

+0

맞습니다. CONTAINS는 부울 일치입니다, 예 또는 아니오입니다. 따라서 관련성을 전혀 분류하지 않습니다. Matt의 조언을 따르고 정렬 대신에 정렬 가능한 RANK를 사용하십시오. –