如果我对在Lucene中先前提交时打开的IndexWriter执行commit()会发生什么?

时间:2012-06-12 04:05:56

标签: commit lucene

当我通过这个精彩的blog by Mike McCandless解释Lucene的Transactional功能的力量,以及我们可以保存旧提交并在之前的提交中打开我们的索引编写者的功能。但是我立即想到了这种情况。它是在内部为先前提交执行的新提交创建某种类型的分支,还是仅仅替换之前提交之后的所有较新提交,并且仅保留我刚刚在先前提交时执行的最近提交?

2 个答案:

答案 0 :(得分:0)

如果要强制提交,请调用commit(),或关闭writer。 提交完成后,新打开的IndexReader实例将看到该提交的索引更改。在此模式下运行时,请注意不要在优化或段合并时刷新读卡器,因为这会占用大量磁盘空间。

无论autoCommit如何,IndexReader或IndexSearcher只能看到"时间点"的索引。它被打开了。在重新打开阅读器之前,读者打开后对索引所做的任何更改都不可见。

void commit()
      Commits all pending changes (added & deleted documents, optimizations, segment merges, added indexes, etc.) to the index, and syncs all referenced index files, such that a reader will see the changes and the index updates will survive an OS or machine crash or power loss.

void commit(Map commitUserData)
      Commits all changes to the index, specifying a commitUserData Map (String -> String).

答案 1 :(得分:0)

实际上它创建了一个分支:新提交将反映您打开的旧提交,以及您在索引会话期间所做的任何更改。未来提交(在您打开的提交之后)发生的事情取决于您的删除政策。如果它保存了这些提交,那么在任何时候你都可以自由地打开一个作者来对抗其中一个,也可以从它们中创建一个分支。