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