Java Lucene NRTManager处理
我正在努力理解如何使用Lucene 据我所知,创建Java Lucene NRTManager处理,java,lucene,Java,Lucene,我正在努力理解如何使用Lucene 据我所知,创建IndexReader成本很高,因此使用搜索管理器应该是正确的选择。但是,SearchManager应该由NRTManager生成(顺便说一句,对于执行的每个添加或删除操作,它应该替换IndexWriter)。但是为了有一个NRTManager,我应该首先有一个IndexWriter,我的问题来了 文件说: IndexWriter是线程安全的 此类的构造函数接受一个目录对象,因此创建instace的成本似乎很高(如IndexReader) 所有
IndexReader
成本很高,因此使用搜索管理器应该是正确的选择。但是,SearchManager
应该由NRTManager
生成(顺便说一句,对于执行的每个添加或删除操作,它应该替换IndexWriter
)。但是为了有一个NRTManager
,我应该首先有一个IndexWriter
,我的问题来了
文件说:
- IndexWriter是线程安全的
- 此类的构造函数接受一个
目录
对象,因此创建instace的成本似乎很高(如IndexReader)
- 所有更改都会定期缓冲和刷新(因此它们似乎鼓励使用单个实例)
但是:
- 更改(尽管已刷新)仅在
提交
或关闭
- 完成更新(添加/删除)后,应关闭实例
- 我也发现了这一点:据说不关闭一个作家可能会毁掉一切
那我该怎么办呢?拥有一个IndexWriter
实例是一个好主意吗(只做commit
而不做close
it)
此外,如果我使用NRTManager
,如何进行提交
?甚至可能吗?这可能会帮助您了解如何使用NRTManager和SearcherManager。它解释了如何在近乎实时的上下文中处理commit
s和重新打开
s
关于您的IndexWriter问题,是的,鼓励使用单个IndexWriter,但您始终需要在某个时候关闭IndexWriter。关闭IndexWriter将执行以下几项操作:
- 等待当前合并操作完成(可选)
- 提交挂起的数据
- 删除目录锁文件
这就是为什么如果IndexWriter未关闭,而索引仍有挂起的更改,文档可能不可见
在长时间运行的应用程序中,您应该在应用程序退出时关闭IndexWriter(在桌面应用程序中,这可以在用户关闭应用程序时完成,在webapp中,这可以通过servlet的destroy方法完成) 谢谢你们,那个博客上的好文章。这让我意识到我不需要NRTManager(在我的情况下,它只会使事情变得过于复杂)。至于IndexWriter的关闭,我将遵循您的建议。