如何检查Lucene IndexWriter实例是否有效/打开?

时间:2011-01-18 20:28:44

标签: lucene lucene.net

很抱歉这个简单的问题,但似乎没有任何明显的方法。根据文档,建议在内存中保留一个IndexWriter的实例,可以一次又一次地用于更新,而不是为每次更改打开和关闭一个实例(这要贵得多)。 / p>

但是,文档还指出,如果发生异常(例如IndexWriter),则应关闭OutOfMemoryException

因此,我需要一些方法来检查我的IndexWriter实例是否有效,假设它可以被其他一些操作关闭。

我意识到如果我在关闭时尝试使用它会产生异常,但是我会在需要之前检查是否需要创建一个新的IndexWriter,所以没有失败发生。

在我看来,一个简单的IsOpen属性/方法将是一个明显的补充。

思想:

我想如果我能确保我的课程是唯一能够关闭IndexWriter的课程,我可以在关闭时将其设置为null,并检查以确保它不是每当我使用它时null,但这不会处理IndexWriter自行关闭的情况(如果现在或将来可能出现这种情况)。

另一个想法是我可以尝试在try / catch块中使用它并使用异常来指示它需要重新打开,但这似乎不是非常有效/优雅。我将使用什么方法来测试IndexWriter的有效性?

2 个答案:

答案 0 :(得分:3)

如果你得到内存不足异常(或任何类型的异常,真的),这可能是一个大问题。您尝试编写的更改可能无法编写,并且您的索引甚至可能已损坏,具体取决于异常发生的时间/方式。

因此,处于故障状态的IndexWriter是一种特殊情况,我认为它肯定需要使用例外,即尝试/捕获。

(我不认为你的捕获会“重新打开作者。”根据异常情况,你可能需要重新索引一些东西,可能是从头开始。当然你不应该期望在你的作家中得到例外的常规发生。)

答案 1 :(得分:1)

我认为如果IndexWriter在访问时关闭,AlreadyClosedException会抛出IndexWriter(请参阅ensureOpen)。因此,如果null不是{{1}},则可以处理。

HTH