Lucene鼓励从多个线程重用IndexWriter。
鉴于两个线程可能具有对IndexWriter的引用,如果线程A在编写器上调用close,则线程B将留下无用的编写器。但据我所知,lucene知道另一个线程使用相同的编写器并推迟其闭包。
确实如此吗? lucene如何跟踪另一个线程使用编写器?
EDIT 从答案来看,关闭IndexWriter是不正确的。但这会带来一个新问题:如果一个人保持IndexWriter打开,实质上阻止从另一个JVM访问此索引(例如,在群集的情况下,或许多应用程序之间的共享索引)。
答案 0 :(得分:6)
如果一个线程关闭了IndexWriter而其他线程仍在使用它,那么你将得到不可预测的结果。我们试图让其他线程命中AlreadyClosedException,但这只是最好的努力(不保证)。你也可以轻松点击NullPointerException。因此,您必须在外部进行同步以确保不执行此操作。
最近(目前仅在Lucene的主干中,最终为4.0)修复了IndexWriter中的一个大线程瓶颈,允许段刷新同时运行(之前它们是单线程的)。在并发硬件上运行许多索引线程的应用程序上,这可以大大提高索引吞吐量。有关详细信息,请参阅http://blog.mikemccandless.com/2011/05/265-indexing-speedup-with-lucenes.html。
答案 1 :(得分:1)
IndexWriter的线程安全和重用意味着您可以使用该实例创建/更新/删除文档的多个线程。如果你在一个线程中关闭索引编写器,它确实会把其他人搞砸。
答案 2 :(得分:0)
您是指waitForMerges
方法上的IndexWriter.close()
标志吗?
在等待或不等待当前正在运行的合并完成时关闭索引。这仅在使用在后台线程中运行合并的MergeScheduler时才有意义。
Lucene通常使用后台线程来整合在多个线程中发生的碎片写入 - 写入本身立即发生,但合并是异步发生的。
关闭编写器时,应该允许它完成整合过程,否则:
总是调用close(false)是危险的,特别是当IndexWriter长时间不打开时,因为这会导致“merge starvation”,从而长期合并将永远无法完成。这将导致索引中的段数过多。
所以作者并不是“知道”你的线程,就像你的意思一样。