Я хочу использовать Lucene.NET для полнотекстового поиска, разделяемого между двумя приложениями: один - приложение ASP.NET MVC, а другое - консольное приложение. Оба приложения должны искать и обновлять индекс.
Как обращаться с concurrency?
Я нашел учебник по ifdefined.com, где обсуждается аналогичный вариант использования. Меня беспокоит то, что блокировка будет большим узким местом.
PS: Также я заметил, что IndexSearcher использует моментальный снимок индекса, и в упомянутом выше руководстве искатель создается только при обновлении индекса. Это хороший подход? Могу ли я просто создать обычный поисковый объект при каждом поиске, и если да, то какие накладные расходы?
Я нашел связанный с ним вопрос Ли Lucene.Net управляет несколькими потоками, обращаясь к одному и тому же индексу, одна индексирует, а другая ищет?, что утверждает, что interprocess concurrency безопасен. Означает ли это, что это не условия гонки для индекса?
Также один очень важный аспект. Каким будет влияние производительности, если пусть говорят, что 10-15 потоков пытаются обновить индекс Lucene, получив общую блокировку, представленную в это решение?
После использования нескольких месяцев я должен добавить, что индекс открытия для поиска часто может создавать исключение OutOfMemory при высоких загрузках центрального процессора и памяти, если запрос использует сортировку. Стоимость операции открытия индекса небольшая (по моему опыту), но стоимость GC может быть довольно высокой.