Правильный ли шаблон использования LINQ to Lucene Index<T> для ASP.NET?

Как правильно использовать LINQ для Lucene? Index<T>?

Это реализует IDisposible так что я подумал, что обернуть его в оператор using будет разумно:

IEnumerable<MyDocument> documents = null;

using (Index<MyDocument> index = new Index<MyDocument>(new System.IO.DirectoryInfo(IndexRootPath)))
{
    documents = index.Where(d => d.Name.Like("term")).ToList();
}

Я иногда испытываю нежелательное удаление индекса на диске. Кажется, это происходит в 100% случаев, если несколько экземпляров индекса существуют одновременно. Я написал тест, используя PLINQ, чтобы запустить 2 поиска параллельно и 1 поиск работает, в то время как другой возвращает 0 результатов, потому что индекс опустошен.

  • Я должен использовать один статический экземпляр вместо этого?
  • Должен ли я обернуть его в Lazy<T>?
  • Могу ли я открыть для себя другие проблемы, когда несколько пользователей одновременно получают доступ к статическому индексу?

Я также хочу периодически переиндексировать по мере необходимости, вероятно, с использованием другого процесса, такого как служба Windows. Собираюсь ли я также столкнуться с проблемами, если пользователи ищут, пока индекс перестраивается?

1 ответ

Решение

Код выглядит как Linq-to-Lucene.

Большинство случаев полностью очищенных индексов Lucene - это новые IndexWriters, созданные с create для параметра установлено значение true. Код в вопросе не обрабатывает индексацию, поэтому дальнейшая отладка затруднена.

Lucene.Net является поточно-ориентированным, и я ожидаю, что linq-to-lucene также подавит это поведение. Один экземпляр статического индекса будет кэшировать содержимое в памяти, но я думаю, вам придется самостоятельно обрабатывать перезагрузку индекса изменений (я не знаю, сделает ли это linq-to-lucene).

При переиндексации не должно быть проблем с использованием нескольких поисковиков / читателей. Lucene создан для поддержки этого сценария. Однако в каталоге может быть только один модуль записи, поэтому никакой другой процесс не может записывать документы в индекс, пока ваша служба Windows должна была оптимизировать индекс.

Другие вопросы по тегам