2010-12-08 10 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 

最終結果はあなたがまだソートしているということですが、あなたはあなたのランキングにそうやっている:例(構文は少しオフでもよいです)。

また、CONTAINSTABLEには、TOP Nベースの結果を制限する機能があるとのMSDNページも記載されています。たぶん、これもあなたの役に立つだろう。

+0

ありがとうございます - あなたは正しいと思われ、それが最善の答えです。ただし、追加の結合と列のオーバーヘッドが必要なのかどうかはわかりません。また、私が持っていた一時テーブルを削除したことに気付きました。おそらくあなたはテストのためにそれをしましたか?ページングロジックには必要と思われます。 –

+0

あなたは正しいです - 私は変更/ CTEを示しただけです。あなたはページングのためにすべてを必要とします。結合のオーバーヘッドに関しては、テーブルの幅とインデックスによっては気付かないかもしれません。いずれのオプションも、外部のFTSエンジンがDBにヒットし、何らかの行ごとの処理を返すことになります。 CONTAINSTABLEの方が速く見つかる人もいます。http://www.eggheadcafe.com/software/aspnet/29849015/contains-vs-containstable-performance.aspx – Matt

+0

CONTAINSは真と真です。だからあなたは本当に関連性を並べるわけではありません。 Mattのアドバイスに従って、代わりにCONTAINSTABLEを使用してソート可能なRANKを与えます。 –

関連する問題