附加模式下的Index Writer导致在unix中打开已删除的文件

时间:2013-06-25 13:13:04

标签: java lucene

我最近将我们的搜索应用程序从Lucene 2.4升级到Lucene 3.6.2 我们运行的工作每4小时从数据库中提取一次更新并更新现有的Lucene索引。

用于创建Index Writer的代码 - :

indexWriter = new IndexWriter(dirPath, new IndexWriterConfig(Version.LUCENE_36,
                    analyzer).setOpenMode(OpenMode.APPEND));

将文档成功添加到我们在Index Writer上执行的现有索引。

indexWriter.commit();
indexWriter.deleteUnusedFiles();
indexWriter.close();

发布上述步骤,我们在IndexSearcher上执行以下操作

this.indexSrchr.getIndexReader().decRef();
this.indexSrchr.close();
// Create a new Index Searcher to point to updated index.
this.indexSrchr = new IndexSearcher(IndexReader.open(dir));

在CREATE模式下打开时,Index Writer完全正常,但使用APPEND模式 导致每次尝试索引更新时都会添加打开的已删除文件。

使用的Unix命令 - :

lsof -u user | grep delete.

如果lucene级别存在问题或我们做错了什么,有人可以帮助我吗?


我能够在代码中的某处解决问题我们没有明确地对indexReader做一个减少引用

this.indexSrchr.getIndexReader().decRef()

但有人可以帮助我理解为什么

this.indexSrchr.close()

不会关闭Index Searcher的基础索引阅读器吗?

1 个答案:

答案 0 :(得分:0)

使用CREATE您可以随时创建新索引,这就是您没有遇到此问题的原因。当您APPEND到索引时,它会识别已经被索引为已删除的文件中的前一个文件。

如果您在阅读目录后未关闭IndexReader,则文件仍然被访问,因此deleteUnusedFiles无法删除这些文件。