在Lucene.NET中失败的IndexWriter.Commit()后重试或恢复

时间:2015-12-16 11:53:23

标签: lucene.net

我们的Lucene.NET索引位于远程机器上,可通过UNC路径访问。出于性能原因(以及似乎是Lucene.NET的最佳实践),IndexWriter在每次修改文档后都不是Commit(),而是每30秒一次。{/ p>

现在,有时候network failsCommit()会出现异常错误。我知道Lucenet.NET完全是ACID",因此这些失败不会破坏索引本身。令我担心的是,尚未提交的文件丢失了。

有没有推荐的处理方法?我是否可以重试IndexWriter.Commit()以期恢复网络连接?或者我应该在RAMDirectory中缓冲文档,然后将这些文档合并到FSDirectory中,并使用重试语义?或完全不同的东西?

1 个答案:

答案 0 :(得分:2)

在我的实现中,我使用的是Oracle表。创建文档时,会向表中添加一行,其中的值指示未编制索引。在IndexWriter提交成功后,我更新表以指示它已被索引(以及一些其他数据,如indexed_date等)。这样,如果出现任何类型的失败,文档将被重新索引(或可能重新编入索引) )当系统或连接恢复时。该表还打开了各种报告和审核能力,否则将无法获得。

这可能不是您的选择。在本地缓冲文档到索引编写器将起作用。如果您只查看本地缓冲区以获取要索引的文档,则不确定为什么需要重试语义。我认为你必须确保在提交成功后从本地缓冲区中删除文档,这样你就不会永远对它进行索引。 ; ^)