我最近将我们的搜索应用程序从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的基础索引阅读器吗?
答案 0 :(得分:0)
使用CREATE
您可以随时创建新索引,这就是您没有遇到此问题的原因。当您APPEND
到索引时,它会识别已经被索引为已删除的文件中的前一个文件。
如果您在阅读目录后未关闭IndexReader
,则文件仍然被访问,因此deleteUnusedFiles
无法删除这些文件。