Обработка Lucene NRTManager - PullRequest
       0

Обработка Lucene NRTManager

2 голосов
/ 19 марта 2012

Я пытаюсь понять, как следует использовать Lucene.

Из того, что я прочитал, создание IndexReader стоит дорого, поэтому использование Search Manager плеча будет правильным выбором.Однако SearchManager должен быть получен NRTManager (который, кстати, должен заменить IndexWriter для каждой выполненной операции добавления или удаления).Но для того, чтобы иметь NRTManager, я должен сначала иметь IndexWriter, и вот моя проблема.

Документация гласит:

  • IndexWriter является поточно-ориентированным
  • конструктор этого класса принимает объект Directory, поэтому кажется, что создание instace должно быть дорогостоящим (как в случае IndexReader)
  • все изменения буферизуются ипериодически очищаются (поэтому они, кажется, поощряют использование одного экземпляра)

    , но:

  • изменения, хотя очищенные будут видны только после commit или close

  • после завершения обновления (добавления / удаления) экземпляр должен быть закрыт
  • Я также нашел это: Забыл закрыть Lucene IndexWriter после добавления Документов в индекс где сказано, что закрытие писателя может все испортить

Так что же мне на самом деле делать?Хорошо ли иметь один IndexWriter экземпляр (сделать только commit и никогда close это)?

Что еще больше, если я использую NRTManager, как я могу сделать commit?Это вообще возможно?

1 Ответ

2 голосов
/ 19 марта 2012

Эта статья блога , вероятно, поможет вам понять, как использовать NRTManager и SearcherManager. Он объясняет, как обрабатывать commit с и reopen с в контексте, близком к реальному.

Что касается ваших вопросов по IndexWriter, да, использование одного IndexWriter приветствуется, но в какой-то момент вам всегда нужно закрывать IndexWriter. Закрытие IndexWriter будет выполнять несколько вещей:

  • ожидание завершения текущих операций слияния (необязательно),
  • данные ожидающие фиксации,
  • удалить файл блокировки каталога.

Вот почему документы могут не отображаться, если IndexWriter не был закрыт, в то время как в индексе еще не было изменений.

В долго работающем приложении вы должны закрыть свой IndexWriter при выходе из приложения (в настольном приложении это можно сделать, когда пользователи закрывают приложение, а в веб-приложении это можно сделать с помощью метода destroy: сервлет).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...