它在Lucene文档中指出,在应用程序中使用IndexWriter和IndexSearcher的一个实例是最快的。
目前,我有一个IndexWriter
的静态实例一直处于打开状态,还有一个IndexSearcher
的静态实例始终保持打开状态,但当IndexWriter
对索引执行任何CRUD操作时会重新生成。我在我的索引管理类上实现了一个Dispose方法,该方法在应用程序结束时关闭IndexWriter
和IndexSearcher
(但它是一个web应用程序,因此可能需要运行数月才能调用)。
这样做听起来合理吗?使用静态实例是否也会带来多线程的问题。。?也就是说,我应该在使用时锁定我的编写器和搜索器吗?
Lucene索引编写器、读取器和搜索器都是线程安全的(例如,请参阅IndexWriter文档的第二个注释或IndexSearcher文档的第一个注释),因此在多个线程中重用相同的实例是没有问题的。
根据对如何管理索引编写器和搜索器的描述,我认为您正在重新实现Lucene的两个实用程序类,您可能会发现这两个类很有帮助:NRTManager和SearcherManager,它们使管理近实时搜索器变得非常容易。