2009-06-08 15 views
19

ल्यूसीन में अंकन को प्राप्त करने के तरीके के बारे में सोचते हुए, क्योंकि यह मूल रूप से पेजिनेशन का समर्थन नहीं करता है। मुझे मूल रूप से 'शीर्ष 10 प्रविष्टियों' (कुछ पैरामीटर के आधार पर) की खोज करने की आवश्यकता है, फिर 'अगली 10 प्रविष्टियां' और इसी तरह। और साथ ही मैं नहीं चाहता कि लुसीन स्मृति को हल करे। सलाह का कोई भी टुकड़ा सराहना की जाएगी। अग्रिम धन्यवाद।लुसीन में अंकन कैसे प्राप्त करें?

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

आप पाएंगे कि scoreDocs सरणी पुनरावृत्ति हल्के हो जाएगा के रूप में डेटा सूचकांक के भीतर निहित वास्तव में नहीं किया जाता है जब तक searcher.Doc विधि कहा जाता है।

कृपया ध्यान दें कि इस उदाहरण Lucene.NET 2.3.2 के एक थोड़ा संशोधित संस्करण के खिलाफ लिखा गया था, लेकिन बुनियादी प्रिंसिपल Lucene के किसी भी हाल के संस्करण के खिलाफ काम करना चाहिए।

+1

मैं सहमत हूं , परिणामस्वरूप ल्यूसीन डेटाबेस के बारे में पूछते समय परिणाम के रूप में भारी नहीं होते हैं, इसलिए आप प्रदर्शन समस्याओं से निपटने के बिना कस्टम पेजिनेशन विधियों को आसानी से कार्यान्वित कर सकते हैं –

+1

समस्या तब होती है जब आप उच्च पेजिनेशन नंबर खोज के साथ बड़े डेटा सेट की खोज धीमे हो रहे हैं । ऐसा लगता है कि आप किसी चीज की खोज करते हैं और फिर खोज का एक हिस्सा छोड़ देते हैं। – Ruwantha

11

पाश का एक और संस्करण, केन के कोड स्निपेट के साथ जारी रखने;

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

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; 
    } 
संबंधित मुद्दे