Правильное структурирование использования Lucene.Net на сайте ASP.NET MVC

Я создаю сайт ASP.NET MVC, где планирую использовать Lucene.Net. Я предвидел способ структурирования использования Lucene, но не уверен, что моя планируемая архитектура в порядке и эффективна.


Мой план:

  • В событии Application_Start в Global.asax: я проверяю наличие индекса в файловой системе - если он не существует, я создаю его и заполняю его документами, извлеченными из базы данных.
  • Когда отправляется новый контент: я создаю IndexWriter, заполняю документ, записываю в индекс и, наконец, удаляю IndexWriter. IndexWriters не используются повторно, поскольку я не могу представить себе хороший способ сделать это в приложении ASP.NET MVC.
  • Когда содержимое редактируется: повторяю тот же процесс, что и при отправке нового контента, за исключением того, что я сначала удаляю старый контент, а затем добавляю изменения.
  • Когда пользователь ищет контент: я проверяю HttpRuntime.Cache, чтобы узнать, действительно ли пользователь выполнил поиск этого термина за последние 5 минут - если они есть, я возвращаю эти результаты; в противном случае я создаю IndexReader, создаю и запускаю запрос, помещаю результаты в HttpRuntime.Cache, возвращаю их пользователю и, наконец, удаляю IndexReader. Еще раз IndexReaders не используются повторно.

Мои вопросы:

  • Это хорошая структура - , как я могу ее улучшить?
  • Существуют ли любые проблемы с производительностью/эффективностью.. Я должен знать.
  • Кроме того, не повторно использовать IndexReaders и IndexWriters огромный запах кода?

Ответ 1

Ответ на все три ваших вопроса один и тот же: повторите использование ваших читателей (и, возможно, ваших авторов). Вы можете использовать шаблон singleton, чтобы сделать это (т.е. Объявить читателя/писателя общедоступным). Lucene FAQ сообщает вам то же самое: поделитесь своими читателями, потому что первый запрос reaaalllyyyy медленный. Lucene обрабатывает все блокировки для вас, поэтому нет причин, по которым у вас не должно быть общего читателя.

Вероятно, проще всего просто держать своего писателя и (используя модель NRT). Если вам редко приходится писать в индекс, или если вам не нужна огромная потребность в скорости, тогда, вероятно, ОК, чтобы открыть своего писателя каждый раз. Это то, что я делаю.

Изменить: добавлен образец кода:

public static IndexWriter writer = new IndexWriter(myDir);

public JsonResult SearchForStuff(string query)
{
    IndexReader reader = writer.GetReader();
    IndexSearcher search = new IndexSearcher(reader);
    // do the search
}

Ответ 2

Я бы, вероятно, пропустил кеширование - Lucene очень, очень эффективен. Возможно, настолько эффективно, что быстрее искать снова, чем кеш.

Полный индекс OnApplication_Start чувствует себя немного от меня - вероятно, должен быть запущен в нем собственный поток, чтобы не блокировать другие дорогостоящие действия по запуску.