Как обновить индекс Lucene.NET?

Вы можете добавить отключение при возникновении такого исключения. Может быть возможно дублирование Кафки Стрим: Изящное отключение

Пожалуйста Проверьте здесь

11
задан user57175 24 January 2009 в 16:16
поделиться

6 ответов

Для обновления lucene индексируют Вас, должен удалить старую запись и запись в новой записи. Таким образом, необходимо использовать IndexReader для нахождения текущего объекта, используйте устройство записи, чтобы удалить его и затем добавить новый объект. То же будет верно для многократных въездов, которые я думаю, то, что Вы пытаетесь сделать. Просто найдите все записи, удалите их всех и затем запишите в новых записях.

4
ответ дан 3 December 2019 в 01:00
поделиться

Как 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.

Надеюсь, это поможет.

19
ответ дан 3 December 2019 в 01:00
поделиться

Если Вы хотите удалить все содержание в индексе и снова наполнить его, Вы могли бы использовать этот оператор

writer = New IndexWriter(indexDirectory, New StandardAnalyzer(), True)

Последний параметр конструктора IndexWriter определяет, создается ли новый индекс, или открыт ли существующий индекс для добавления новых документов.

6
ответ дан 3 December 2019 в 01:00
поделиться

Если Вы только не изменяете небольшое количество документов (скажите, меньше чем 10% общего количества), это почти наверняка быстрее (Ваш пробег может варьироваться в зависимости от, хранил/индексировал поля, и т.д.) повторно индексировать с нуля.

Тем не менее я всегда индексировал бы к временному каталогу и затем перемещал бы новый в место, когда это сделано. Тот путь, существует мало времени простоя, в то время как индекс создает, и если что-то идет не так, как надо, у Вас все еще есть хороший индекс.

3
ответ дан 3 December 2019 в 01:00
поделиться

Есть много устаревших примеров удаления с полем 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();
11
ответ дан 3 December 2019 в 01:00
поделиться

Один из вариантов - это, конечно, удалить документ, а затем добавить его обновленную версию.

В качестве альтернативы вы можете использовать метод UpdateDocument() класса IndexWriter:

writer.UpdateDocument(new Term("patient_id", document.Get("patient_id")), document);

Это, конечно, требует наличия механизма, с помощью которого вы можете найти документ, который хотите обновить ("patient_id" в данном примере).

Я написал в блоге более подробную информацию с более полным примером исходного кода.

2
ответ дан 3 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: