Я создал прототип приложения поиска/просмотра в C# с помощью Lucene.Net. Исходные данные представляют собой один скромный 5MB XML-файл (содержащий около 900 «документов»), который я индексирую с помощью Lucene. Мои поисковые запросы работают нормально и быстро. Для этого приложения просмотр и просмотр каждого документа «нажмите» очень важен, поэтому пользователь может выбрать хит и посмотреть полное представление этого документа (обычно это соответствует половине экрана), и мне нужны соответствующие условия поиска, выделенные в этом Посмотреть. Я использую WPF и подход MVVM. В настоящее время представление документа реализовано примерно с десятком ContentControls, из которых шесть предназначены для отображения полей с возможностью поиска, которые используют highlightConverter.Как повысить эффективность работы Lucene Highlighter?
Производительность была довольно плохая, поэтому я добавил секундомер, чтобы изолировать проблему. Метод 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 в действии» книгу и снова листал соответствующие части, чтобы увидеть, если я мог бы получить какие-либо идеи. Я также искал в сети хороший бит. Итак, вот пара вопросов или областей возможного исследования.
- Могу ли я опустить счет? Мне не нужно показывать контекст соответствия поисковым запросам, поэтому мне не нужно разбивать хит-файл на фрагменты и получать «оценку» для различных фрагментов. Я хочу, чтобы список удалений показывался по названию, а затем, когда пользователь выбирает один удар, весь документ попадания отображается с подсветкой. Я вижу, как использовать NullFragmenter и GetBestFragment, но я не знаю, будет ли это замыкать операцию подсчета очков. Опуская счет улучшит производительность?
- Я рассмотрел рефакторинг моего представления, чтобы иметь один виджет для , отображающий удаленный документ как один текст HTML или RTF. Таким образом, Я мог бы вызвать метод выделения только один раз вместо 10 или 15 раз (некоторые ContentControls находятся внутри элемента ItemsControl, поэтому есть несколько экземпляров некоторых полей в представлении). Я ожидаю, что это будет значительно повысить производительность. Выделение было бы на текст , который был помечен форматированием таблицы и т. Д., Но я полагаю, что будет работать?
- Есть ли что-то еще, что мне не хватает, что делает мой метод выделения настолько медленным? Половина секунды кажется слишком медленным - как будто я действительно испортил что-то основное.
Я перешел к варианту 2, и он отлично работает. Я боялся, что помеченная строка HTML не будет правильно подсвечена из-за разметки, и поскольку документация Lucene подчеркивает, что содержимое, переданное маркеру, должно соответствовать точно индексированному содержимому. Но я полагаю, что эти документы были всего лишь напоминанием о том, что ваш индекс обновлен. Я буду держать вопрос открытым, так как я считаю, что это обходное решение вместо решения. –