提问者:小点点

追加模式下的索引编写器导致在 unix 中打开已删除的文件


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

用于创建索引编写器的代码:

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));

当在创建模式下打开时,索引编写器工作得非常好,但是在附加模式下,它会导致每次尝试更新索引时添加打开的已删除文件。

使用的Unix命令-:

lsof -u user | grep delete.

如果Lucene级别本身有问题,或者我们做错了什么,有人能帮我吗?

我能够解决这个问题,因为在代码中的某个地方,我们没有在indexReader上显式地减少引用

this.indexSrchr.getIndexReader().decRef()

但有人能帮我理解为什么吗

this.indexSrchr.close()

不关闭索引搜索器的基础索引读取器?


共1个答案

匿名用户

使用 CREATE,您可以一直创建一个新索引,这就是您不会遇到此问题的原因。当您将 U追加到索引时,它会将已编制索引的前一个文件识别为已删除。

如果您在阅读目录后不关闭IndexReader,则文件仍在访问中,因此它们无法被deleteUnusedFiles删除。