मैं पिछले कुछ दिनों से ल्यूसीन दस्तावेज़ खोज कार्यक्रम पर काम कर रहा हूं और अब तक सबकुछ ठीक से चल रहा है। मैं अपने खोज परिणामों के लिए प्रासंगिक स्निपेट दिखाने के लिए 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 उपयोग कर रहा हूँ।
आप 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) –
@JfBeaulac शानदार! इसने तुरंत इस मुद्दे को हल किया। मुझे नहीं पता कि मैंने कभी भी दस्तावेज में उस समारोह को क्यों नहीं देखा, मैंने इसे ठीक से छोड़ दिया होगा। किसी भी मामले में, कृपया अपनी टिप्पणी को उत्तर के रूप में लिखें और मैं खुशी से इसे स्वीकार करूंगा। – ean5533