2009-06-08 14 views
19

ページネーションを本質的にサポートしていないため、Luceneでページネーションを達成する方法が不思議です。私は基本的には「上位10項目」(いくつかのパラメータに基づいて)、次に「次の10項目」などを検索する必要があります。それと同時に、私はLuceneに記憶を欲しがってほしくない。 アドバイスはありがたいです。 ありがとうございます。ルーケンでページネーションを達成する方法は?

+0

この記事で承認された答えを確認してください。 [Luceneの4ページネーション] [1] [1]:http://stackoverflow.com/a/24533377/1080485同意 –

答えて

20

以下のような独自のページングメカニズムを適用する必要があります。

IList<Document> luceneDocuments = new List<Document>(); 

IndexReader indexReader = new IndexReader(directory); 
Searcher searcher = new IndexSearcher(indexReader); 

TopDocs results = searcher.Search("Your Query", null, skipRecords + takeRecords); 
ScoreDoc[] scoreDocs = results.scoreDocs; 

for (int i = skipRecords; i < results.totalHits; i++) 
{ 
     if (i > (skipRecords + takeRecords) - 1) 
     { 
      break; 
     } 

     luceneDocuments.Add(searcher.Doc(scoreDocs[i].doc)); 
} 

あなたはsearcher.Docメソッドが呼び出されるまで、インデックス内に含まれるデータが実際に使用されていないようscoreDocs配列を反復することは、軽量になることがわかります。

この例は、Lucene.NET 2.3.2のわずかに変更されたバージョンに対して書かれていますが、基本的なプリンシパルはLuceneの最新バージョンに対して動作するはずです。

+1

Luceneの結果はデー​​タベースのクエリ結果と同じくらい重くはないので、パフォーマンスの問題に対処することなくカスタムページネーションのメソッドを簡単に実装できます –

+1

ページ番号の大きい検索で大きいデータセットを検索すると検索が遅くなります。それはあなたが物事を検索してから、検索の一部を省略するようなものです。 – Ruwantha

11

Kaneのコードスニペットに続く別のバージョンのループ。

.................... 

ScoreDoc[] scoreDocs = results.scoreDocs; 
int pageIndex = [User Value]; 
int pageSize = [Configured Value]; 

int startIndex = (pageIndex - 1) * pageSize; 
int endIndex = pageIndex * pageSize; 
endIndex = results.totalHits < endIndex? results.totalHits:endIndex; 

for (int i = startIndex ; i < endIndex ; i++) 
{ 
    luceneDocuments.Add(searcher.Doc(scoreDocs[i].doc)); 
} 
2

私は次の方法でページ付けします。誰かを助けるかもしれません。具体的には、パフォーマンスの観点から、より良い戦略が分かっている場合は、共有してください。

public TopDocs search(String query, int pageNumber) throws IOException, ParseException { 
     Query searchQuery = parser.parse(query); 
     TopScoreDocCollector collector = TopScoreDocCollector.create(1000, true); 

     int startIndex = (pageNumber - 1) * MyApp.SEARCH_RESULT_PAGE_SIZE; 
     searcher.search(searchQuery, collector); 

     TopDocs topDocs = collector.topDocs(startIndex, MyApp.SEARCH_RESULT_PAGE_SIZE); 
     return topDocs; 
    } 
関連する問題