我使用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"预订并再次翻阅相关部分,看看我是否能得到任何想法。我也在网上搜索了一下。所以,这里有几个可能探索的问题或领域。