Как удалить индекс Lucene, не затрагивая другие неиндексные файлы в каталоге? - PullRequest
2 голосов
/ 21 февраля 2011

Я хочу записать индекс Lucene в памяти на диск, поверх первоначально загруженного индекса.В настоящее время, если я звоню Directory.Copy( _ramDirectory, _fileSystemDirectory, false ), он просто добавляет новые файлы в каталог, но оставляет старые (устаревшие) там.

Я пытался позвонить:

new IndexWriter( _fsd, _analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED ).Close();

... (создать новый пустой индекс в каталоге), но это ведет к странному поведению и иногда приводит к чистке всего индекса при следующем запуске программы.

Есть ли способ, которым я могу просто получить списокфайлы, которые в настоящее время использует индекс файловой системы, чтобы я мог удалить их вручную?Я не хочу слепо стирать все файлы в каталоге, если там есть неиндексированные файлы.

Видимо FSDirectory.ListAll() перечисляет все файлы в физическом каталоге, независимо от того, являются ли они на самом деле частьюиндекс.Есть ли какой-нибудь способ, которым я могу сказать, используется ли определенный файл / создан индексом?Я имею в виду, что даже не могу проверить расширения файлов из-за странных соглашений Lucene об именах файлов.

Ответы [ 2 ]

3 голосов
/ 21 февраля 2011

Я бы определенно рекомендовал вам не смешивать другие файлы в папке индекса Lucene.

Наилучшим решением было бы создание нового индекса с помощью конструктора IndexWriter, который имеет параметр create, который будет создавать новый индекс в местоположении. Затем вы используете метод IndexWriter.AddIndexesNoOptimize(Directory[] dirs), чтобы добавить RamDirectory в FSDirectory

3 голосов
/ 21 февраля 2011
  1. Если вы используете Lucene 2.9 или выше, все IndexWriters используют скрытый каталог ОЗУ, который, вероятно, будет быстрее, чем вы создаете свой собственный каталог ОЗУ и затем пытаетесь вручную выполнить сброс на диск.См. FAQ о NRT .
  2. Если вы действительно хотите использовать свой собственный каталог RAM, откройте существующий (не RAM) индекс, а затем выполните IndexWriter.DeleteAll() и оптимизируйте.
...