我已经三次检查我的输入,我可以验证我正在使用的查询字符串是否存在于输入文本中,但是荧光笔有时会随意返回一个空字符串.这个问题是可以重现的;返回空白片段的文档在使用相同查询时将继续返回空白片段,而具有合法片段的文档将继续具有合法片段.
但是,问题不是特定于文档的.某些查询返回文档的有效片段,其他查询返回同一文档的空字符串.问题似乎也与我的分析仪无关;问题出现在我是使用StandardAnalyzer还是snowballAnalyzer.
经过几个小时的探索,我无法在查询/文档中找到任何失败的模式而不是那些有效的模式.请记住,这是在使用完全相同的查询从Lucene索引中专门撤回的文档上发生的.这意味着搜索者能够在目标文档中找到相关的查询字符串,但荧光笔不能.
这是Lucene的一个错误吗?如果是这样,我该如何解决呢?
我的代码:
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本质上只是一个结构,它存储有关找到的文档的信息.方法MapLucenedocumentToData将Lucene文档转换为我的自定义DVDoc类,没有魔法.)
因为每个人都喜欢示例输入和输出:
> Example of GetBestFragments working
> Example of GetBestFragments NOT working
我正在使用Lucene.NET版本2.9.4g.
解决方法 默认情况下,Highlighter将仅处理document的前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)
总结以上是内存溢出为你收集整理的c# – Lucene Hightlighter有时会莫名其妙地返回空白片段全部内容,希望文章能够帮你解决c# – Lucene Hightlighter有时会莫名其妙地返回空白片段所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)