如何在不影响目录中的其他非索引文件的情况下删除Lucene索引?

时间:2011-02-21 17:40:21

标签: lucene lucene.net

我想要将内存中的Lucene索引写回磁盘,超过最初加载的索引。目前,如果我调用Directory.Copy( _ramDirectory, _fileSystemDirectory, false ),它只是将新文件添加到目录中,但在那里留下旧的(陈旧的)文件。

我试着打电话:

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

...(在目录中创建一个新的空索引)但这有奇怪的行为,有时会导致整个索引在下次运行程序时被清除干净。

有什么方法可以简单地获取文件系统索引当前使用的文件列表,这样我可以手动删除它们吗?我不想盲目地删除目录中的所有文件,以防有一些非索引文件。

显然FSDirectory.ListAll()列出了物理目录中的所有文件,无论它们是否实际上是索引的一部分。有什么办法可以判断索引是否使用/创建了特定文件?我的意思是由于Lucene奇怪的文件命名约定,我甚至无法检查文件扩展名。

2 个答案:

答案 0 :(得分:3)

  1. 如果您使用的是Lucene 2.9或更高版本,则所有IndexWriters都使用幕后的RAM目录,这可能比您创建自己的RAM目录然后尝试手动刷新到磁盘更快。请参阅FAQ about NRT
  2. 如果您确实想使用自己的RAM目录,请打开现有(非RAM)索引,然后执行IndexWriter.DeleteAll()并进行优化。

答案 1 :(得分:3)

我绝对建议你不要在Lucene索引文件夹中混合使用其他文件。

最佳解决方案是使用具有create参数的IndexWriter构造函数创建新索引,该构造函数将在该位置创建新索引。然后使用IndexWriter.AddIndexesNoOptimize(Directory[] dirs)方法将RamDirectory添加到FSDirectory