2013-03-23 14 views
5

मैं ल्यूसीन 4.2 का उपयोग कर रहा हूं और परिणाम पृष्ठांकन लागू कर रहा हूं।लुसीन 4 अंकन

IndexSearcher.searchAfter "अगला पृष्ठ" कार्यक्षमता को लागू करने का एक प्रभावी तरीका प्रदान करता है लेकिन "पिछले पृष्ठ" या यहां तक ​​कि "पृष्ठ पर जाएं" कार्यक्षमता को लागू करने का सबसे अच्छा तरीका क्या है? उदाहरण के लिए IndexSearcher.searchBefore नहीं है।

मैं पेज के आकार वाले पृष्ठों की कुल संख्या निर्धारित करने और प्रत्येक पृष्ठ के लिए ScoreDoc को ट्रैक करने के लिए ScoreDoc[] सरणी को रखने पर विचार कर रहा था (परिणाम के रूप में सरणी पॉप्युलेट हो जाएगी)। यह मुझे IndexSearcher.searchAfter (या सबसे खराब मामले में शून्य) में उपयोग के लिए "निकटतम" ScoreDoc का उपयोग करने की अनुमति देगा।

क्या यह समझ में आता है? क्या कोई बेहतर दृष्टिकोण है?

+0

हाय, क्या आप लुसीन 4.x में अंकन के बारे में समझा सकते हैं और मुझे भी एक ही समस्या का सामना करना पड़ रहा है .. –

+0

मैं ऊपर दिए गए अनुच्छेद में चर्चा के दृष्टिकोण का उपयोग कर रहा हूं। यह बहुत गहरी पेजिंग को छोड़कर काफी अच्छा प्रदर्शन करता है (कोई आश्चर्य नहीं)। – hudsonb

उत्तर

11

मैं ल्यूसीन 4.8 का उपयोग कर रहा हूं और एक आरईएसटी इंटरफेस पर काम कर रहा हूं जिसमें अंकन शामिल है। मेरा समाधान एक टॉपस्कोरडोकॉलिलेटर का उपयोग करना है और शीर्ष डॉक्स (int startIndex, int numberOfhits) विधि को कॉल करें। प्रारंभ सूचकांक की गणना शून्य आधारित पृष्ठ संख्या को हिट की संख्या से गुणा करके की जाती है।

... 
DirectoryReader reader = DirectoryReader.open(MMapDirectory.open(java.io.File(indexFile)); 
IndexSearcher searcher = new IndexSearcher(reader); 
TopScoreDocCollector collector = TopScoreDocCollector.create(MAX_RESULTS, true); // MAX_RESULTS is just an int limiting the total number of hits 
int startIndex = (page -1) * hitsPerPage; // our page is 1 based - so we need to convert to zero based 
Query query = new QueryParser(Version.LUCENE_48, "All", analyzer).parse(searchQuery); 
searcher.search(query, collector); 
TopDocs hits = collector.topDocs(startIndex, hitsPerPage); 
... 

तो मेरा आरईएसटी इंटरफ़ेस पृष्ठ संख्या और पैरामीटर के रूप में प्रति पृष्ठ हिट की संख्या स्वीकार करता है। तो आगे या पीछे जाकर पृष्ठ

+0

धन्यवाद जैमी, मुझे यह दृष्टिकोण पसंद है। – hudsonb

4

के लिए उपयुक्त मान के साथ एक नया अनुरोध सबमिट करने जितना सरल है, मैं जैमी द्वारा समझाया गया समाधान से सहमत हूं। लेकिन मैं एक और पहलू को इंगित करना चाहता हूं जिसके बारे में आपको अवगत होना चाहिए और जो खोज इंजन के सामान्य तंत्र को समझने में मदद कर रहा है।

TopDocCollector के साथ आप स्कोर या अन्य प्रकार के मानदंडों द्वारा क्रमबद्ध होने से पहले, अपनी खोज क्वेरी से मेल खाने के लिए कितनी हिट एकत्र करना चाहते हैं, यह परिभाषित कर सकते हैं।

collector = TopScoreDocCollector.create(9999, true); 
searcher.search(parser.parse("Clone Warrior"), collector); 
// get first page 
topDocs = collector.topDocs(0, 10); 
int resultSize=topDocs.scoreDocs.length; // 10 or less 
int totalHits=topDocs.totalHits; // 9999 or less 

हम Lucene यहाँ बता 9999 खोज वाक्यांश 'क्लोन योद्धा' वाले दस्तावेज़ों की एक अधिकतम एकत्र करने के लिए:

निम्नलिखित उदाहरण देखें। इसका मतलब है, अगर सूचकांक में 99 99 से अधिक दस्तावेज हैं जो इस खोज वाक्यांश वाले हैं, तो 99 99 हिट से भरने के बाद संग्राहक रुक जाएगा!

इसका मतलब है कि जितना अधिक आप MAX_RESULTS चुनते हैं उतना ही बेहतर खोज परिणाम बन जाते हैं। लेकिन यह केवल तभी प्रासंगिक है जब आप बड़ी संख्या में हिट की उम्मीद करते हैं। दूसरी तरफ यदि आप "ल्यूक स्काईवाकर" की खोज करते हैं और आप MAX_RESULTS की तुलना में केवल एक हिट की उम्मीद करेंगे।

तो MAX_RESULTS को बदलकर लौटाए गए स्कोर डॉक्स को प्रभावित कर सकते हैं जैसे सॉर्टिंग किया जाएगा एकत्रित हिट पर। यह व्यावहारिक रूप से MAX_RESULTS को एक आकार में सेट करना है जो इतना बड़ा है कि मानव उपयोगकर्ता किसी विशिष्ट दस्तावेज़ को याद करने के लिए बहस नहीं कर सकता है। यह अवधारणा SQL डेटाबेस के व्यवहार के विपरीत पूरी तरह से विपरीत है, जो हमेशा पूर्ण डेटा पूल पर विचार करती है।

लेकिन लुसीन भी एक और तंत्र का समर्थन करता है। आप कलेक्टर के लिए MAX_RESULTS को परिभाषित करने के बजाय, वैकल्पिक रूप से उस समय की परिभाषा को परिभाषित कर सकते हैं जब आप परिणाम के लिए प्रतीक्षा करना चाहते हैं। तो उदाहरण के लिए आप परिभाषित कर सकते हैं कि आप हमेशा 300ms के बाद कलेक्टर को रोकना चाहते हैं। प्रदर्शन समस्याओं के लिए अपने आवेदन की रक्षा के लिए यह एक अच्छा तरीका है। लेकिन यदि आप यह सुनिश्चित करना चाहते हैं कि आप सभी प्रासंगिक दस्तावेज़ों की गणना करें, तो आपको MAX_RESULTS के लिए पैरामीटर सेट करना होगा या अधिकतम प्रतीक्षा समय को अंतहीन मान पर सेट करना होगा।

संबंधित मुद्दे