Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Lucene Hightlighter有时会莫名其妙地返回空白片段_C#_Lucene.net - Fatal编程技术网

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

C# Lucene Hightlighter有时会莫名其妙地返回空白片段,c#,lucene.net,C#,Lucene.net,在过去的几天里,我一直在做一个Lucene文档搜索程序,到目前为止,一切都进展顺利。我试图使用Lucene.Net.Highlight.Highlighter类为我的搜索结果显示相关的代码片段,但它的工作方式并不一致大多数时候调用Highlighter.GetBestFragments()完全按照我的预期执行(显示包含给定查询字符串的相关文本片段),但有时它只返回空字符串 我已经三次检查了我的输入,我可以验证我使用的查询字符串是否存在于输入文本中,但荧光笔有时只是随意返回一个空字符串。问题是可重

在过去的几天里,我一直在做一个Lucene文档搜索程序,到目前为止,一切都进展顺利。我试图使用
Lucene.Net.Highlight.Highlighter
类为我的搜索结果显示相关的代码片段,但它的工作方式并不一致大多数时候调用
Highlighter.GetBestFragments()
完全按照我的预期执行(显示包含给定查询字符串的相关文本片段),但有时它只返回空字符串

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

但是,问题并非特定于文档。一些查询返回文档的有效片段,而其他查询返回同一文档的空字符串。问题似乎也与我的分析仪无关;无论我是使用
标准分析器
还是
雪球分析器
,问题都会出现

经过数小时的摸索,我无法在查询/文档中找到任何失败的模式,而不是那些有效的模式。请记住,这种情况发生在使用完全相同的查询专门从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;
    }
}
private static SimpleHTMLFormatter\u formatter=new SimpleHTMLFormatter(“,”);
私有静态SimpleFragmenter _fragmenter=新SimpleFragmenter(50);
...
{
使用(var searcher=newindexsearcher(analyzerInfo.Directory,false))
{
QueryParser解析器=新的QueryParser(Lucene.Net.Util.Version.Lucene_29,“Text”,analyzerInfo.Analyzer);
解析器.SetMultiTermRewriteMethod(MultiTermQuery.SCORING\u BOOLEAN\u QUERY\u REWRITE);
//生成查询
BooleanQuery BooleanQuery=新的BooleanQuery();
Add(newtermquery(newterm(“PageNum”,“0”)),BooleanClause.occure.MUST);
添加(parser.Parse(searchQuery),BooleanClause.occure.MUST);
Query=booleanQuery.Rewrite(searcher.GetIndexReader());
//从查询中获取结果
ScoreDoc[]hits=searcher.Search(查询,50).ScoreDocs;
List results=hits.Select(hit=>MapLuceneDocumentToData(searcher.Doc(hit.Doc))).ToList();
//向搜索结果中添加相关片段(显示选择某个结果的原因)
QueryScorer scorer=新的QueryScorer(查询);
Highlighter Highlighter=新的Highlighter(_格式化程序、记分器);
highlighter.SetTextFragmenter(_fragmenter);
foreach(结果中的DVDoc结果)
{
TokenStream=analyzerInfo.Analyzer.TokenStream(“文本”,新的StringReader(result.Text));
result.RelevantFragments=highlighter.GetBestFragments(流,result.Text,3,“…”;
}
//清理
analyzerInfo.Analyzer.Close();
searcher.Close();
返回结果;
}
}
(注意:
DVDoc
本质上只是一个存储找到的文档信息的结构。方法
MapLuceneDocumentToData
将Lucene
文档
转换为我的自定义
DVDoc
类,没有魔力。)

由于每个人都喜欢示例输入和输出:


我使用的是Lucene.NET 2.9.4g版。

默认情况下,荧光笔只处理文档的前51200个字符

要增加此限制,请设置
MaxDocCharsToAnalyze
属性


您是否尝试过修改MaxDocCharsToAnalyze值@太棒了!这立即解决了问题。我不知道为什么我从来没有注意到文档中的函数,我一定是跳过了它。无论如何,请写下你的评论作为回答,我很乐意接受。出于好奇,有人能告诉我,如果我有非常大的文档要分析,最好的方法是什么吗?我猜MaxDocCharsToAnalyze属性可以设置为Int32.MaxValue,当前为2147483647。如果我需要分析比这更多的文本,会发生什么?