Ответ 1
Прежде всего, мы должны определить операцию "write". Операция записи будет блокировать блокировку после запуска операции записи и будет продолжаться до тех пор, пока вы не закроете объект, выполняющий работу. Такие, как создание IndexWriter и индексация документа, заставят писать объект блокировки, и он будет удерживать эту блокировку до тех пор, пока вы не закроете IndexWriter.
Теперь мы можем немного поговорить о замке. Эта блокировка, которая является объектом, является блокировкой на основе файлов. Как упоминалось ранее мифом, существует файл, называемый "write.lock", который создается. Как только блокировка записи заблокирована, она является исключительной! Эта блокировка вызывает все операции модификации индекса (IndexWriter и некоторые методы из IndexReader) до тех пор, пока блокировка не будет удалена.
В целом вы и имеете несколько чтений по индексу. Вы можете даже читать и писать одновременно, без проблем. Но есть проблема при наличии нескольких авторов. Если один поток ожидает слишком долго блокировки, он отключится.
1) Возможное решение # 1 Прямые операции
Если вы уверены, что операции индексирования короткие и быстрые, вы можете использовать один и тот же индекс одновременно. В противном случае вам придется подумать о том, как вы хотите организовать операции индексирования приложений.
2) Возможное решение # 2 Веб-сервис
Поскольку вы работаете с веб-решением, возможно создание веб-службы. При реализации этой веб-службы я бы выделил рабочий поток для индексирования. Я бы создал рабочую очередь, чтобы содержать работу, и если очередь содержала несколько заданий, она должна захватить их всех и сделать их в пакетном режиме. Это решит все проблемы.
3) создайте еще один индекс, затем слейте
Если приложение консоли действительно сильно работает с индексом, вы можете посмотреть, как консольное приложение может создать отдельный индекс в консольном приложении, а затем объединить индексы в определенное безопасное запланированное время с помощью IndexWriter.AddIndexes.
отсюда вы можете сделать это двумя способами, вы можете объединиться с прямым индексом. Или вы можете объединиться для создания третьего индекса, а затем, когда этот индекс будет готов, замените исходный индекс. Вы должны быть осторожны в том, что вы здесь делаете, чтобы убедиться, что вы не собираетесь блокировать что-то в тяжелом использовании и вызывать тайм-аут для других операций записи.
4) Индекс и поиск нескольких индексов
Лично я считаю, что людям нужно отделять свои индексы. Это помогает отделить обязанности от программ и минимизировать время простоя и поддерживать единую точку для всех индексов. Например, если ваше консольное приложение отвечает только за добавление в определенных полях или ваше расширение расширяет индекс, вы можете разглядеть отдельные индексы, но сохраните личность, используя поле идентификатора в каждом документе. Теперь вы можете воспользоваться встроенной поддержкой поиска нескольких индексов с использованием класса MultiSercher. Или, если вы хотите, есть также класс ParallelMultiSearch, который может одновременно искать оба индекса.
5) Посмотрите на SOLR
Что-то еще, что может помочь вам в сохранении одного места для вашего индекса, вы можете изменить свою программу для работы с сервером SOLR. http://lucene.apache.org/solr/ есть также хороший SOLRNET http://code.google.com/p/solrnet/ библиотека, которая может быть полезна в этой ситуации. Хотя у меня нет опыта с solr, но у меня создается впечатление, что это поможет вам управлять ситуацией, такой как это. Кроме того, он имеет другие преимущества, такие как выделение ярлыков и поиск связанных предметов путем поиска элементов "MoreLikeThis" или обеспечения проверки орфографии.
Я уверен, что есть и другие методы, но это все те, о которых я могу думать. В целом, ваше решение зависит от того, сколько людей пишут и как обновлять индекс поиска, в котором вы нуждаетесь. В целом, если вы можете отложить некоторые операции в последний раз и выполнить некоторые пакетные операции в любой ситуации, вы получите максимальную производительность. Мое предложение - понять, с чем вы способны работать и идти оттуда. удачи