Правильное структурирование использования Lucene.Net на сайте ASP.NET MVC - PullRequest
26 голосов
/ 14 августа 2010

Я создаю сайт 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 aогромный кодовый запах?

Ответы [ 2 ]

15 голосов
/ 17 августа 2010

Ответ на все три ваших вопроса один и тот же: повторно используйте ваших читателей (и, возможно, ваших писателей).Вы можете использовать шаблон singleton , чтобы сделать это (то есть объявить ваш читатель / писатель как открытый статический). FAQ от Lucene говорит вам то же самое: поделитесь своими читателями, потому что первый запрос слишком медленный.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
}
13 голосов
/ 28 января 2011

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

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

...