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

如何删除Lucene索引而不影响目录中的其他非索引文件?,lucene,lucene.net,Lucene,Lucene.net,我想把一个内存中的Lucene索引写回磁盘,超过最初加载的索引。当前,如果我调用Directory.Copy(\u ramDirectory,\u fileSystemDirectory,false),它只会将新文件添加到目录中,而将旧的(过时的)文件保留在那里 我试着打电话: new IndexWriter( _fsd, _analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED ).Close(); …(在目录中创建一个新的空索引)但这有奇怪

我想把一个内存中的Lucene索引写回磁盘,超过最初加载的索引。当前,如果我调用
Directory.Copy(\u ramDirectory,\u fileSystemDirectory,false)
,它只会将新文件添加到目录中,而将旧的(过时的)文件保留在那里

我试着打电话:

new IndexWriter( _fsd, _analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED ).Close();
…(在目录中创建一个新的空索引)但这有奇怪的行为,有时会导致整个索引在下一次运行程序时被清除

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

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

  • 如果您使用的是Lucene 2.9或更高版本,则所有IndexWriter都使用后台RAM目录,这可能比创建自己的RAM目录然后尝试手动刷新到磁盘要快。看
  • 如果确实要使用自己的RAM目录,请打开现有(非RAM)索引,然后执行
    IndexWriter.DeleteAll()
    并进行优化
    我绝对建议你不要在Lucene索引文件夹中混合使用其他文件


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

    即使您使用CFS,我想您仍然会有segments.gen、segments*和*.del(至少)。我完全同意,但在我的应用程序中,用户可以自定义索引的位置,因此他们可能(意外地)将它设置为某个现有的重要文件夹——我真的不想更新索引以彻底清除该文件夹。标记为“答案”,因为它实际上是对所述问题的最佳答案,尽管Xodarap的观点实际上可能使该问题不相关(至少在我的情况下)。嗯,有趣!我不知道。这实际上可能会让事情变得更简单——我计划检查索引的大小,如果索引超过一定大小,则使用文件系统目录——这“幕后”IndexWriter是否为我做到了这一点?@chaiguy:你可以看到
    IndexWriter.SetMaxBufferedDocs
    IndexWriter.SetRAMBufferSizeMB