我正在对使用Lucene版本3.6.1的现有代码库进行一些更改。
IndexSearcher已经针对每个搜索请求进行了实例化。
IndexReader reader = IndexReader.open(index);
IndexSearcher searcher = new IndexSearcher(reader);
已使用RAMDirectory
并且close方法未被记录。
完成定期重新索引,并在发生这种情况时创建RAMDirectory的新实例。但是现有的IndexReader #close方法尚未被调用。
以下是我的问题。
答案 0 :(得分:1)
Q>不在IndexReader上调用close方法有什么影响?
A>对于基于文件系统的索引,您可能会运行文件描述符。但是,如果所有IndexSearcher
和IndexReader
都成为GCable,那么这不应该是一个大问题。也就是说,如果你不关心偶尔的内存峰值 - 但这取决于你的使用模式。
Q>不在RAMDirectory上调用close方法有什么影响?
A>内部地图无法清除。同样,如果你丢弃RAMDirectory
的实例并重新创建它,那不是什么大不了的事。但我仍然关闭它以避免隐形错误并可能帮助GC。
Q>对索引阅读器的引用不会保留在任何地方。所以为了关闭它,我可以做IndexSearcher.getIndexReader().close()?
A>是的,创建IndexSearcher
后,它始终会引用可以使用上述方法访问的原始IndexReader
。
Q>是否有类似的方式来访问目录,以便我可以在重新索引发生时关闭它? A>不。您打算保留此参考。