Lucene IndexWriter线程安全

Lucene鼓励从多个线程重用IndexWriter。

鉴于两个线程可能具有对IndexWriter的引用,如果线程A在编写器上调用close,则线程B将留下无用的编写器。 但据我所知,lucene以某种方式知道另一个线程使用相同的编写器并推迟其闭包。

确实如此吗? lucene如何跟踪另一个线程使用编写器?

编辑根据答案判断,关闭IndexWriter是不正确的。 但这会带来一个新问题:如果一个人保持IndexWriter打开,实质上阻止从另一个JVM访问此索引(例如,在群集的情况下,或许多应用程序之间的共享索引)。

如果一个线程关闭了IndexWriter而其他线程仍在使用它,那么你将得到不可预测的结果。 我们尝试让其他线程命中AlreadyClosedException,但这只是最好的努力(不保证)。 你也可以轻松点击NullPointerException。 因此,您必须在外部进行同步,以确保不执行此操作。

最近(目前仅在Lucene的主干中,最终为4.0)修复了IndexWriter中的一个大线程瓶颈,允许段刷新同时运行(之前它们是单线程的)。 在并发硬件上运行许多索引线程的应用程序上,这可以大大提高索引吞吐量。 有关详细信息,请参见http://blog.mikemccandless.com/2011/05/265-indexing-speedup-with-lucenes.html 。

IndexWriter的线程安全和重用意味着您可以使用该实例创建/更新/删除文档的多个线程。 如果你在一个线程中关闭索引编写器,它确实会把其他人搞砸。

你是指IndexWriter.close()方法上的waitForMerges标志?

在等待或不等待当前运行的合并完成时关闭索引。 这仅在使用在后台线程中运行合并的MergeScheduler时才有意义。

Lucene通常使用后台线程来整合跨多个线程发生的碎片写入 – 写入本身立即发生,但合并是异步发生的。

关闭编写器时,应该允许它完成整合过程,否则:

总是调用close(false)是危险的,特别是当IndexWriter长时间不打开时,因为这会导致“合并饥饿”,从而长期合并永远不会有机会完成。 这将导致索引中的段过多。

所以作者并不是“知道”你的线程,就像你的意思。