2009-06-08 29 views
19

. Temel olarak 'ilk 10 girdiyi' (bazı parametrelere göre), ardından 'sonraki 10 giriş' ve daha fazlasını aramam gerekiyor. Ve aynı zamanda Lucene'nin belleklerini almasını istemiyorum. Her türlü tavsiye takdir edilecektir. Şimdiden teşekkürler.lucene'de sayfalandırma nasıl elde edilir? bu doğal sayfalandırma desteklemediği, Lucene sayfalandırma ulaşmak için nasıl merak

+0

onay bu yazı onaylanan cevap: [Lucene 4 sayfalandırmayı] [1] [1]: http://stackoverflow.com/a/24533377/1080485 –

cevap

20
Kendi sayfalama mekanizması, aşağıda buna benzer bir şey uygulamak gerekir

.

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)); 
} 

Sen searcher.Doc yöntemi denir kadar endeks içinde yer alan veri gerçekten kullanılmaz olarak scoreDocs dizi yineleme hafif olacağı bulacaksınız.

bu örnek Lucene.Net 2.3.2 biraz değiştirilmiş bir sürümü karşı yazılmış olduğunu unutmayın, ancak temel anapara Lucene herhangi yeni bir sürümü mücadele etmelidir. Kane'in kod parçası ile devam

+1

Katılıyorum , Lucene sonuçları kolayca performans sorunları ile uğraşmak zorunda kalmadan özel sayfalama yöntemlerini hayata geçirebilmesi için bir veritabanı sorgulama ederken yüksek sayfalandırma numarası arama yavaş oluyor seti büyük veri aradığınızda –

+1

burada sorunudur sonuçları kadar ağır değildir . Bir şey aradığınız gibi, aramanın bir kısmını atlayın. – Ruwantha

11

döngü başka bir sürümü;

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

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

Sayfalama yapmak için aşağıdaki yolu kullanıyorum, birisi yardımcı olabilir. Daha iyi bir strateji biliyorsanız, özellikle performans bakış açısından, lütfen paylaşın.

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; 
    } 
İlgili konular