我正在对使用Lucene 3.6.1版的现有代码库进行一些更改。

每个搜索请求均已实例化IndexSearcher。

 IndexReader reader = IndexReader.open(index);
 IndexSearcher searcher = new IndexSearcher(reader);


已使用RAMDirectory且尚未计算close方法。

定期重新编制索引,并在发生这种情况时创建RAMDirectory的新实例。但是尚未调用现有的IndexReader#close方法。

以下是我的问题。


不调用close方法对IndexReader有什么影响?
不对RAMDirectory调用close方法有什么影响?
索引阅读器的引用不会保留在任何地方。因此,为了关闭它,我可以做IndexSearcher.ggetIndexReader()。close()吗?
有没有类似的方法可以访问目录,以便在重新编制索引时可以将其关闭?

最佳答案

问>不对IndexReader调用close方法有什么影响?
A>对于基于文件系统的索引,您可能会运行文件描述符。但是,如果所有IndexSearcherIndexReader都变为GCable,那么这没什么大不了的。也就是说,如果您不关心偶发的内存高峰-但这取决于您的使用模式。

问>不对RAMDirectory调用close方法有什么影响?
A>内部地图不会清除。同样,如果丢弃RAMDirectory实例并重新创建它,没什么大不了的。但是我仍然会关闭它,以避免出现隐蔽的错误并可能帮助GC。

问>索引阅读器的引用没有保留在任何地方。所以要关闭它,我可以做IndexSearcher.getIndexReader().close()?
A>是的,一旦创建了IndexSearcher,它就始终引用原始的IndexReader,可以使用上述方法对其进行访问。

问>是否有类似的方法可以访问目录,以便在重新编制索引时可以将其关闭?
A>否。您打算保留此引用。

10-02 07:39