它在Lucene文档中指出,在整个应用程序中使用IndexWriter和IndexSearcher的一个实例是最快的。
目前我的IndexWriter
静态实例始终处于打开状态,而IndexSearcher
的静态实例始终处于打开状态,但在IndexWriter
执行时会重建索引上的任何CRUD操作。我已经在我的索引管理类上实现了一个Dispose方法,当应用程序结束时它关闭IndexWriter
和IndexSearcher
(但它是一个Web应用程序,所以这可能需要几个月才能运行而不被调用)。 / p>
这听起来像是合理的做事方式吗?并且使用静态实例也存在多线程问题..?即我应该在使用时锁定我的作家和搜索者吗?
答案 0 :(得分:6)
Lucene索引编写者,读者和搜索者是线程安全的(例如参见2nd note of the doc of IndexWriter或1st of the doc of IndexSearcher),因此在多个线程中重复使用相同的实例是没有问题的。
根据您如何管理索引编写者和搜索者的描述,我认为您正在重新实现两个Lucene实用程序类,您可能会发现它们很有帮助:NRTManager和SearcherManager这使得它非常简单管理近实时搜索者。