【问题标题】:Index Writer in Append mode causing open deleted files in unix附加模式下的索引编写器导致在 unix 中打开已删除的文件
【发布时间】:2013-06-25 13:13:03
【问题描述】:

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

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

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

发布成功将文档添加到我们在索引编写器上执行的现有索引。

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 模式下打开的索引编写器工作得很好,但在 APPEND 模式下它 导致每次我尝试更新索引时都会添加打开的已删除文件。

使用的Unix命令-:

lsof -u user | grep delete.

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


我能够解决这个问题,因为在代码中的某个地方我们没有明确地对 indexReader 进行减少引用

this.indexSrchr.getIndexReader().decRef()

但是谁能帮我理解为什么

this.indexSrchr.close()

不关闭 Index Searcher 的底层索引读取器?

【问题讨论】:

    标签: java lucene


    【解决方案1】:

    使用CREATE 您始终创建一个新索引,这就是您不会遇到问题的原因。当您 APPEND 进入索引时,它会将已索引的前一个文件识别为已删除。

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

    【讨论】:

      猜你喜欢
      • 2018-02-12
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 2022-06-25
      • 1970-01-01
      • 2021-12-31
      • 2015-07-18
      • 2020-12-23
      相关资源
      最近更新 更多