Внедрение Apache Lucene
Я читаю исходный код Apache Lucene в течение последних нескольких недель и пытаюсь выяснить метод или класс, который в первую очередь отвечает за запись списков / индексов сообщений на диск. Я много читал об индексации и пытался найти точку, где в процессе вызывается какой-то метод для записи индекса на диск, но он не удался. Я знаю, что индексы или список публикаций пишутся периодически, когда какой-то внутренний буфер заполнен. Если кто-то уже прочитал код или знает, где все это делается, расскажите, пожалуйста. Спасибо
1 ответ
Я не знаю ответа, однако мне тоже очень интересно об этом. После недолгого поиска я наткнулся на это на странице indexWriter.
public final void commit () throws IOException Передает все ожидающие изменения (добавленные и удаленные документы, слияния сегментов, добавленные индексы и т. д.) в индекс и синхронизирует все ссылочные файлы индекса, чтобы читатель мог видеть изменения и обновления индекса переживет сбой ОС или машины или потерю мощности. Обратите внимание, что это не ждет завершения любых текущих фоновых слияний. Это может быть дорогостоящей операцией, поэтому вы должны проверить стоимость в вашем приложении и делать это только тогда, когда это действительно необходимо.
Обратите внимание, что эта операция вызывает Directory.sync для файлов индекса. Этот вызов не должен возвращаться, пока содержимое файла и метаданные не будут находиться в стабильном хранилище. Для FSDirectory это вызывает fsync операционной системы. Но будьте осторожны: некоторые аппаратные устройства могут фактически записывать в кеш даже во время fsync и возвращаться до того, как биты будут на самом деле в стабильном хранилище, создавая впечатление более высокой производительности. Если у вас есть такое устройство, и у него нет резервной батареи (например), то при потере питания оно все равно может потерять данные. Lucene не может гарантировать согласованность на таких устройствах.
ПРИМЕЧАНИЕ: если этот метод попадает в OutOfMemoryError, вы должны немедленно закрыть программу записи. Смотрите выше для деталей.
Определяется: commit в интерфейсе TwoPhaseCommit Броски: IOException См. Также: prepareCommit (), commit (Map)