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