如何提高Lucene Highlighter操作的性能?

时间:2016-06-29 20:57:58

标签: performance lucene lucene.net lucene-highlighter

我使用Lucene.Net在C#中编写了一个搜索/浏览应用程序的原型。源数据是一个单一的5MB XML文件(包含大约900"文档"),我使用Lucene进行索引。我的搜索工作正常并且速度很快。对于这个应用程序,浏览和查看每个" hit"文档很重要,因此用户可以选择匹配并查看该文档的完整视图(通常适合屏幕的一半),并且我需要在该视图中突出显示匹配的搜索项。我正在使用WPF和MVVM方法。文档视图目前使用大约十几个ContentControl实现,其中六个用于显示使用highlightConverter的可搜索字段。

性能很差,所以我添加了秒表计时来隔离问题。我的模型中的HighlightSearchTerms方法似乎是罪魁祸首(执行大约100-600毫秒)。如果我将此方法短路以返回输入文本,则性能很好。

以下是方法:

_analyzer is a StandardAnalyzer(_luceneVersion)
_parser is a QueryParser(_luceneVersion, “content”, _analyzer)
_formatter is a SimpleHTMLFormatter(“|~S~|”, “|~E~|”);

private string HighlightSearchTerms(string text, string queryString)
{
    var query = new BooleanQuery();
    query.Add(_parser.Parse(queryString), Occur.SHOULD);
    var fragmentScorer = new QueryScorer(query);
    var highlighter = new Highlighter(_formatter, fragmentScorer);
    highlighter.TextFragmenter = new NullFragmenter();
    var tokenStream = _analyzer.TokenStream(null, new StringReader(text));
    string highlightedText = highlighter.GetBestFragment(tokenStream, text);
    return highlightedText == null ? text : highlightedText;
}

几年前,我读到了" Lucene In Action"预订并再次翻阅相关部分,看看我是否能得到任何想法。我也在网上搜索了一下。所以,这里有几个可能探索的问题或领域。

  1. 我能否以某种方式省略得分?我不需要显示匹配的上下文 搜索字词,所以我不需要将热门文档分解为 碎片并得到一个"得分"对于各种碎片。我想要 标题显示的匹配列表,然后当用户选择一个匹配时, 整个命中文档以高亮显示。我明白了 使用NullFragmenter和GetBestFragment,但我不知道是否这样 短路评分操作。会遗漏得分 提高绩效?
  2. 我考虑过重构我的视图以获得一个小部件 将命中文档显示为一个HTML或RTF文本。那样, 我只能调用高亮方法一次而不是10或15 times(一些ContentControls在ItemsControl中,所以有 视图上某些字段的多个实例)。我希望这会 显着提升性能。突出显示的是文本 那是用表格格式标记的,但我想 那还能用吗?
  3. 我还缺少一些能让我成为突出方法的东西 太慢了?半秒似乎太慢 - 就像我真的搞乱了一些基本的东西。

1 个答案:

答案 0 :(得分:0)

根据我已经给出的答案here,您可以获得额外的改进。