Lucene IndexWriter.ExpungeDeletes()所需的可用磁盘空间量

Lucene IndexWriter.ExpungeDeletes()所需的可用磁盘空间量,lucene,Lucene,我正在编写一个应用程序,它利用Lucene索引,用户必须频繁地更新或删除索引文档 我知道,如果有人想要永久删除标记为从Lucene索引中删除的文档,那么他有两种选择: index writer.Optimize()或 Indexwriter.ExpungeDeletes() 由于为每个删除会话优化索引既昂贵又耗时,而且需要2倍的可用磁盘空间,因此在磁盘空间不足的情况下,Optimize()似乎不是一个好的选择 所以很明显,我不得不选择ExpungeDeletes(),它声称耗时更少,而且不会强制

我正在编写一个应用程序,它利用Lucene索引,用户必须频繁地更新或删除索引文档

我知道,如果有人想要永久删除标记为从Lucene索引中删除的文档,那么他有两种选择:

  • index writer.Optimize()或

  • Indexwriter.ExpungeDeletes()

  • 由于为每个删除会话优化索引既昂贵又耗时,而且需要2倍的可用磁盘空间,因此在磁盘空间不足的情况下,Optimize()似乎不是一个好的选择

    所以很明显,我不得不选择ExpungeDeletes(),它声称耗时更少,而且不会强制合并所有段,所以希望它不需要2倍的可用空间

    但此操作仍然需要一些可用磁盘空间才能成功合并特定段

    所以我的问题是:

    ExpungeDeletes()成功完成其任务需要多少可用磁盘?

    我问这个问题是因为我用一些已经优化并合并到单个段中的索引对其进行了测试…我发现只有当可用磁盘空间至少与索引大小相同时,expungedeletes()才会在这种情况下成功,否则它会引发异常:MergePolicy MergeException

    另外,在上述情况下,是否有任何方法可以防止引发此异常?


    提前感谢。

    您可能对JIRA问题感兴趣。总而言之:
    expungeDeletes
    是一个糟糕的名字,因为它不仅删除了删除内容,还保留了索引的其余部分

    如果您想知道它的确切性能:
    expungeDeltes
    只需对每个已删除的段调用merge。在你的情况下,听起来可能是每一部分,所以。。。大致相当于调用
    optimize

    你认为需要优化的搜索不起作用怎么办