Lucene.Net を使用して、C# で検索/閲覧アプリケーションのプロトタイプを作成しました。ソース データは、Lucene を使用してインデックスを作成した 1 つの適度な 5 MB の XML ファイル (約 900 の "ドキュメント" を含む) です。私の検索は正常に機能しており、かなり高速です。このアプリケーションでは、各「ヒット」ドキュメントをブラウズして表示することが重要であるため、ユーザーはヒットを選択してそのドキュメントの完全なビュー (通常は画面の半分に収まる) を確認できます。一致する検索語がハイライト表示されている必要があります。見る。私は WPF と MVVM アプローチを使用しています。ドキュメント ビューは現在、約 12 個の ContentControls で実装されており、そのうちの 6 個は、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 の使用方法はわかりましたが、それがスコアリング操作を短絡させるかどうかはわかりません。スコアリングを省略すると、パフォーマンスが向上しますか?
- ビューをリファクタリングして、ヒット ドキュメントを HTML または RTF テキストの 1 つの塊として表示するための単一のウィジェットを作成することを検討しました。そうすれば、10 回または 15 回ではなく、1 回だけハイライト メソッドを呼び出すことができます (一部の ContentControls は ItemsControl 内にあるため、ビューにはいくつかのフィールドの複数のインスタンスがあります)。これにより、パフォーマンスが大幅に向上することを期待しています。強調表示は、表の書式設定などでマークアップされたテキストになりますが、それでも機能すると思いますか?
- ハイライト方法が非常に遅くなる原因が他にありませんか? 0.5 秒では遅すぎるように思えます。基本的なことを本当に台無しにしているように思えます。