我正在编写一个利用 Lucene 索引的应用程序,其中用户必须 经常更新或删除 索引文档。
我知道如果有人想从 Lucene 索引中永久删除标记为删除的文档,那么他有两个选择:
由于为每个删除 session 优化索引既昂贵又耗时,并且需要 2X 可用磁盘空间 ,因此在磁盘空间不足的情况下,Optimize() 似乎不是一个好的选择。
所以很明显我不得不选择 ExpungeDeletes() ,它声称耗时更少,并且因为它不会强制合并所有段,所以希望它不需要 2x 可用空间。
但是此操作仍然需要一些可用磁盘空间才能成功合并特定段。
所以我的问题是:
ExpungeDeletes() 需要多少可用磁盘才能成功完成其任务?
我问这个问题是因为我已经用一些已经优化并合并到单个段的索引对其进行了测试……我发现 expungedeletes() 只有在可用磁盘空间至少相同时才会在这种情况下成功大小作为索引,否则抛出异常: MergePolicy-MergeException
另外,有什么办法可以防止在上述情况下抛出此异常?
提前致谢。
最佳答案
您可能对 JIRA 问题 3577 感兴趣。总结一下:expungeDeletes
是一个糟糕的名字,因为它不仅删除了删除内容,而且不理会索引的其余部分。
如果你想知道它的确切性能:expungeDeltes
只是在每个有删除的段上调用合并。在您的情况下,这听起来可能是每个段,所以......大致相当于调用 optimize
。
您认为需要优化的搜索不起作用怎么办?
关于lucene - Lucene IndexWriter.ExpungeDeletes() 所需的可用磁盘空间量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8718459/