c# – Lucene Hightlighter有时会莫名其妙地返回空白片段

前端之家收集整理的这篇文章主要介绍了c# – Lucene Hightlighter有时会莫名其妙地返回空白片段前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在过去的几天里,我一直在研究Lucene文档搜索程序,到目前为止,一切都进展顺利.我正在尝试使用Lucene.Net.Highlight.Highlighter类来显示搜索结果的相关片段,但它不能始终如一地工作.大多数情况下,调用Highlighter.GetBestFragments()完全符合我的预期(显示其中包含给定查询字符串的相关文本片段),但有时它只返回一个空字符串.

我已经三次检查我的输入,我可以验证我正在使用的查询字符串是否存在于输入文本中,但是荧光笔有时会随意返回一个空字符串.这个问题是可以重现的;返回空白片段的文档在使用相同查询时将继续返回空白片段,而具有合法片段的文档将继续具有合法片段.

但是,问题不是特定于文档的.某些查询返回文档的有效片段,其他查询返回同一文档的空字符串.问题似乎也与我的分析仪无关;问题出现在我是使用StandardAnalyzer还是SnowballAnalyzer.

经过几个小时的探索,我无法在查询/文档中找到任何失败的模式而不是那些有效的模式.请记住,这是在使用完全相同的查询从Lucene索引中专门撤回的文档上发生的.这意味着搜索者能够在目标文档中找到相关的查询字符串,但荧光笔不能.

这是Lucene的一个错误吗?如果是这样,我该如何解决呢?

我的代码

  1. private static SimpleHTMLFormatter _formatter = new SimpleHTMLFormatter("<b>","</b>");
  2. private static SimpleFragmenter _fragmenter = new SimpleFragmenter(50);
  3. ...
  4. {
  5. using (var searcher = new IndexSearcher(analyzerInfo.Directory,false))
  6. {
  7. QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29,"Text",analyzerInfo.Analyzer);
  8. parser.SetMultiTermRewriteMethod(MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE);
  9.  
  10. //build query
  11. BooleanQuery booleanQuery = new BooleanQuery();
  12. booleanQuery.Add(new TermQuery(new Term("PageNum","0")),BooleanClause.Occur.MUST);
  13. booleanQuery.Add(parser.Parse(searchQuery),BooleanClause.Occur.MUST);
  14. Query query = booleanQuery.Rewrite(searcher.GetIndexReader());
  15.  
  16. //get results from query
  17. scoreDoc[] hits = searcher.Search(query,50).scoreDocs;
  18. List<DVDoc> results = hits.Select(hit => MapLuceneDocumentToData(searcher.Doc(hit.Doc))).ToList();
  19.  
  20. //add relevant fragments to search results (shows WHY a certain result was chosen)
  21. Queryscorer scorer = new Queryscorer(query);
  22. Highlighter Highlighter = new Highlighter(_formatter,scorer);
  23. Highlighter.SetTextFragmenter(_fragmenter);
  24. foreach (DVDoc result in results)
  25. {
  26. TokenStream stream = analyzerInfo.Analyzer.TokenStream("Text",new StringReader(result.Text));
  27. result.RelevantFragments = Highlighter.GetBestFragments(stream,result.Text,3,"...");
  28. }
  29.  
  30. //clean up
  31. analyzerInfo.Analyzer.Close();
  32. searcher.Close();
  33.  
  34. return results;
  35. }
  36. }

(注意:DVDoc本质上只是一个结构,它存储有关找到的文档的信息.方法MapLuceneDocumentToData将Lucene文档转换为我的自定义DVDoc类,没有魔法.)

因为每个人都喜欢示例输入和输出

> Example of GetBestFragments working
> Example of GetBestFragments NOT working

我正在使用Lucene.NET版本2.9.4g.

解决方法

猜你在找的C#相关文章