Вы можете добавить отключение при возникновении такого исключения. Может быть возможно дублирование Кафки Стрим: Изящное отключение
Пожалуйста Проверьте здесь
Для обновления lucene индексируют Вас, должен удалить старую запись и запись в новой записи. Таким образом, необходимо использовать IndexReader для нахождения текущего объекта, используйте устройство записи, чтобы удалить его и затем добавить новый объект. То же будет верно для многократных въездов, которые я думаю, то, что Вы пытаетесь сделать. Просто найдите все записи, удалите их всех и затем запишите в новых записях.
Как Steve упомянул, необходимо использовать экземпляр IndexReader и назвать его метод DeleteDocuments. DeleteDocuments принимает или экземпляр объекта Термина или внутренний идентификатор Lucene документа (обычно не рекомендуется использовать внутренний идентификатор, как он может и изменяться как сегменты слияний Lucene).
Лучший способ состоит в том, чтобы использовать уникальный идентификатор, который Вы сохранили в индексе, характерном для Вашего приложения. Например, в индексе пациентов в кабинете врача, если у Вас было поле, названное "patient_id", Вы могли бы создать термин и передачу что как аргумент DeleteDocuments. Посмотрите следующий пример (извините, C#):
int patientID = 12;
IndexReader indexReader = IndexReader.Open( indexDirectory );
indexReader.DeleteDocuments( new Term( "patient_id", patientID ) );
Затем Вы могли добавить терпеливую запись снова с экземпляром IndexWriter. Я узнал о много из этой статьи http://www.codeproject.com/KB/library/IntroducingLucene.aspx.
Надеюсь, это поможет.
Если Вы хотите удалить все содержание в индексе и снова наполнить его, Вы могли бы использовать этот оператор
writer = New IndexWriter(indexDirectory, New StandardAnalyzer(), True)
Последний параметр конструктора IndexWriter определяет, создается ли новый индекс, или открыт ли существующий индекс для добавления новых документов.
Если Вы только не изменяете небольшое количество документов (скажите, меньше чем 10% общего количества), это почти наверняка быстрее (Ваш пробег может варьироваться в зависимости от, хранил/индексировал поля, и т.д.) повторно индексировать с нуля.
Тем не менее я всегда индексировал бы к временному каталогу и затем перемещал бы новый в место, когда это сделано. Тот путь, существует мало времени простоя, в то время как индекс создает, и если что-то идет не так, как надо, у Вас все еще есть хороший индекс.
Есть много устаревших примеров удаления с полем id. Приведенный ниже код будет работать с Lucene.NET 2.4.
Нет необходимости открывать IndexReader, если вы уже используете IndexWriter или для доступа к IndexSearcher.Reader. Вы можете использовать IndexWriter.DeleteDocuments (Term), но сложность заключается в том, чтобы убедиться, что вы правильно сохранили свое поле id. Обязательно используйте Field.Index.NOT_ANALYZED в качестве параметра индекса в поле идентификатора при сохранении документа. Это индексирует поле без его токенизации, что очень важно, и ни одно из других значений Field.Index не будет работать при таком использовании:
IndexWriter writer = new IndexWriter("\MyIndexFolder", new StandardAnalyzer());
var doc = new Document();
var idField = new Field("id", "MyItemId", Field.Store.YES, Field.Index.NOT_ANALYZED);
doc.Add(idField);
writer.AddDocument(doc);
writer.Commit();
Теперь вы можете легко удалить или обновить документ с помощью того же средства записи:
Term idTerm = new Term("id", "MyItemId");
writer.DeleteDocuments(idTerm);
writer.Commit();
Один из вариантов - это, конечно, удалить документ, а затем добавить его обновленную версию.
В качестве альтернативы вы можете использовать метод UpdateDocument() класса IndexWriter:
writer.UpdateDocument(new Term("patient_id", document.Get("patient_id")), document);
Это, конечно, требует наличия механизма, с помощью которого вы можете найти документ, который хотите обновить ("patient_id" в данном примере).
Я написал в блоге более подробную информацию с более полным примером исходного кода.