2016-06-29 2 views
0

Я создал прототип приложения поиска/просмотра в 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 в действии» книгу и снова листал соответствующие части, чтобы увидеть, если я мог бы получить какие-либо идеи. Я также искал в сети хороший бит. Итак, вот пара вопросов или областей возможного исследования.

  1. Могу ли я опустить счет? Мне не нужно показывать контекст соответствия поисковым запросам, поэтому мне не нужно разбивать хит-файл на фрагменты и получать «оценку» для различных фрагментов. Я хочу, чтобы список удалений показывался по названию, а затем, когда пользователь выбирает один удар, весь документ попадания отображается с подсветкой. Я вижу, как использовать NullFragmenter и GetBestFragment, но я не знаю, будет ли это замыкать операцию подсчета очков. Опуская счет улучшит производительность?
  2. Я рассмотрел рефакторинг моего представления, чтобы иметь один виджет для , отображающий удаленный документ как один текст HTML или RTF. Таким образом, Я мог бы вызвать метод выделения только один раз вместо 10 или 15 раз (некоторые ContentControls находятся внутри элемента ItemsControl, поэтому есть несколько экземпляров некоторых полей в представлении). Я ожидаю, что это будет значительно повысить производительность. Выделение было бы на текст , который был помечен форматированием таблицы и т. Д., Но я полагаю, что будет работать?
  3. Есть ли что-то еще, что мне не хватает, что делает мой метод выделения настолько медленным? Половина секунды кажется слишком медленным - как будто я действительно испортил что-то основное.
+0

Я перешел к варианту 2, и он отлично работает. Я боялся, что помеченная строка HTML не будет правильно подсвечена из-за разметки, и поскольку документация Lucene подчеркивает, что содержимое, переданное маркеру, должно соответствовать точно индексированному содержимому. Но я полагаю, что эти документы были всего лишь напоминанием о том, что ваш индекс обновлен. Я буду держать вопрос открытым, так как я считаю, что это обходное решение вместо решения. –

ответ

0

Вы можете получить дополнительное улучшение в соответствии с ответом, который я уже дал here.

+0

Спасибо за ваш ответ !! Я рассмотрю это дальше. Я действительно видел это сообщение раньше и пытался добавить WITH_POSITIONS_OFFSETS, но не видел большого улучшения.Теперь, когда я получил удовлетворительную производительность (используя вариант 2), я хотел бы провести некоторое тестирование скорости и увидеть влияние этого параметра на различные операции поиска и выделения. Поскольку текст, который я выделяю, представляет собой агрегацию информации HTML из разных полей исходного документа, мне интересно, будут ли позиции и смещения иметь значение. Мне придется вникать и понять, как это может сработать. –

+0

Хорошо, обратите внимание, что для того, чтобы увидеть улучшения, вам нужно будет повторно проиндексировать свой контент, поскольку у вас нет позиции и смещения, хранящихся прямо сейчас. – AR1

Смежные вопросы