2012-05-23 17 views
6

मैं पिछले कुछ दिनों से ल्यूसीन दस्तावेज़ खोज कार्यक्रम पर काम कर रहा हूं और अब तक सबकुछ ठीक से चल रहा है। मैं अपने खोज परिणामों के लिए प्रासंगिक स्निपेट दिखाने के लिए Lucene.Net.Highlight.Highlighter कक्षा का उपयोग करने का प्रयास कर रहा हूं, लेकिन यह लगातार काम नहीं कर रहा है। कॉलिंग Highlighter.GetBestFragments() कॉल करने के समय ठीक वही करता है जो मैं अपेक्षा करता हूं (उन में दिए गए क्वेरी स्ट्रिंग के साथ प्रासंगिक टेक्स्ट स्निपेट दिखाता है), लेकिन कभी-कभी यह केवल खाली स्ट्रिंग देता है।ल्यूसीन हाइटलाइटर कभी-कभी अनजाने में रिक्त टुकड़े लौटाता है

मैंने अपने इनपुट की तीन बार जांच की है और मैं सत्यापित कर सकता हूं कि मैं जिस क्वेरी स्ट्रिंग का उपयोग कर रहा हूं वह इनपुट टेक्स्ट में मौजूद है, लेकिन हाइलाइटर कभी-कभी मनमाने ढंग से एक खाली स्ट्रिंग देता है। समस्या पुनरुत्पादित है; जिन दस्तावेजों में रिक्त टुकड़े लौटे हैं, वे एक ही प्रश्न का उपयोग करते समय रिक्त टुकड़े लौटे रहेंगे, जबकि वैध टुकड़े वाले दस्तावेज़ों में वैध टुकड़े होते रहेंगे।

हालांकि, समस्या दस्तावेज़-विशिष्ट नहीं है। कुछ प्रश्न दस्तावेज़ के लिए वैध टुकड़े लौटाते हैं जहां अन्य प्रश्न एक ही दस्तावेज़ के लिए खाली स्ट्रिंग लौटाते हैं। समस्या मेरे विश्लेषक से संबंधित प्रतीत नहीं होती है; समस्या यह दिखाती है कि क्या मैं StandardAnalyzer या SnowballAnalyzer का उपयोग करता हूं।

चारों ओर घूमने के कई घंटों के बाद मैं उन प्रश्नों/दस्तावेजों में कोई पैटर्न नहीं ढूंढ पाया जो काम करने वाले बनाम असफल हो जाते हैं। ध्यान रखें कि यह दस्तावेजों पर हो रहा है जो विशेष रूप से ल्यूसीन इंडेक्स से सटीक उसी क्वेरी का उपयोग करके वापस खींच लिया गया था। इसका मतलब है कि Searcher लक्ष्य दस्तावेज़ में प्रासंगिक क्वेरी स्ट्रिंग ढूंढने में सक्षम है लेकिन Highlighter नहीं है।

क्या यह लुसीन में एक बग है? यदि हां, तो मैं इसके आसपास कैसे काम कर सकता हूं?

मेरे कोड:

private static SimpleHTMLFormatter _formatter = new SimpleHTMLFormatter("<b>", "</b>"); 
private static SimpleFragmenter _fragmenter = new SimpleFragmenter(50); 
... 
{ 
    using (var searcher = new IndexSearcher(analyzerInfo.Directory, false)) 
    { 
     QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "Text", analyzerInfo.Analyzer); 
     parser.SetMultiTermRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE); 

     //build query 
     BooleanQuery booleanQuery = new BooleanQuery(); 
     booleanQuery.Add(new TermQuery(new Term("PageNum", "0")), BooleanClause.Occur.MUST); 
     booleanQuery.Add(parser.Parse(searchQuery), BooleanClause.Occur.MUST); 
     Query query = booleanQuery.Rewrite(searcher.GetIndexReader()); 

     //get results from query 
     ScoreDoc[] hits = searcher.Search(query, 50).ScoreDocs; 
     List<DVDoc> results = hits.Select(hit => MapLuceneDocumentToData(searcher.Doc(hit.Doc))).ToList(); 

     //add relevant fragments to search results (shows WHY a certain result was chosen) 
     QueryScorer scorer = new QueryScorer(query); 
     Highlighter highlighter = new Highlighter(_formatter, scorer); 
     highlighter.SetTextFragmenter(_fragmenter); 
     foreach (DVDoc result in results) 
     { 
      TokenStream stream = analyzerInfo.Analyzer.TokenStream("Text", new StringReader(result.Text)); 
      result.RelevantFragments = highlighter.GetBestFragments(stream, result.Text, 3, "..."); 
     } 

     //clean up 
     analyzerInfo.Analyzer.Close(); 
     searcher.Close(); 

     return results; 
    } 
} 

(ध्यान दें:।। DVDoc अनिवार्य रूप से सिर्फ एक struct जो दस्तावेज है कि पाए गए के बारे में जानकारी संग्रहीत करता है विधि MapLuceneDocumentToData, अपने कस्टम DVDoc वर्ग में एक Lucene Document बदल जाता है कोई जादू वहाँ)

और क्योंकि हर कोई उदाहरण इनपुट और आउटपुट पसंद करती है:

मैं Lucene.NET संस्करण 2.9.4g उपयोग कर रहा हूँ।

+2

आप MaxDocCharsToAnalyze मूल्य को संशोधित करने की कोशिश की है? http://lucene.apache.org/core/old_versioned_docs/versions/2_9_2/api/contrib-highlighter/org/apache/lucene/search/highlight/Highlighter.html#setMaxDocCharsToAnalyze(int) –

+0

@JfBeaulac शानदार! इसने तुरंत इस मुद्दे को हल किया। मुझे नहीं पता कि मैंने कभी भी दस्तावेज में उस समारोह को क्यों नहीं देखा, मैंने इसे ठीक से छोड़ दिया होगा। किसी भी मामले में, कृपया अपनी टिप्पणी को उत्तर के रूप में लिखें और मैं खुशी से इसे स्वीकार करूंगा। – ean5533

उत्तर

9

डिफ़ॉल्ट रूप से हाइलाइटर केवल दस्तावेज़ के पहले 51200 वर्णों को संसाधित करेगा।

इस सीमा को बढ़ाने के लिए, MaxDocCharsToAnalyze संपत्ति सेट करें।

http://lucene.apache.org/core/old_versioned_docs/versions/2_9_2/api/contrib-highlighter/org/apache/lucene/search/highlight/Highlighter.html#setMaxDocCharsToAnalyze(int)

+1

जिज्ञासा से बाहर, क्या कोई मुझे बता सकता है कि मेरे पास विश्लेषण करने के लिए बहुत बड़े दस्तावेज़ हैं तो सबसे अच्छा तरीका क्या होगा? मुझे लगता है कि MaxDocCharsToAnalyze प्रॉपर्टी को Int32.MaxValue पर सेट किया जा सकता है जो वर्तमान में 2147483647 है। क्या होता है यदि मुझे टेक्स्ट का विश्लेषण करने की आवश्यकता है जो इससे अधिक है? – Vineet