我们的Lucene.NET索引位于远程机器上,可通过UNC路径访问。出于性能原因(以及似乎是Lucene.NET的最佳实践),IndexWriter
在每次修改文档后都不是Commit()
,而是每30秒一次。{/ p>
现在,有时候network fails和Commit()
会出现异常错误。我知道Lucenet.NET完全是ACID",因此这些失败不会破坏索引本身。令我担心的是,尚未提交的文件丢失了。
有没有推荐的处理方法?我是否可以重试IndexWriter.Commit()
以期恢复网络连接?或者我应该在RAMDirectory
中缓冲文档,然后将这些文档合并到FSDirectory
中,并使用重试语义?或完全不同的东西?
答案 0 :(得分:2)
在我的实现中,我使用的是Oracle表。创建文档时,会向表中添加一行,其中的值指示未编制索引。在IndexWriter提交成功后,我更新表以指示它已被索引(以及一些其他数据,如indexed_date等)。这样,如果出现任何类型的失败,文档将被重新索引(或可能重新编入索引) )当系统或连接恢复时。该表还打开了各种报告和审核能力,否则将无法获得。
这可能不是您的选择。在本地缓冲文档到索引编写器将起作用。如果您只查看本地缓冲区以获取要索引的文档,则不确定为什么需要重试语义。我认为你必须确保在提交成功后从本地缓冲区中删除文档,这样你就不会永远对它进行索引。 ; ^)