有关IndexSearcher / IndexReader和Directory的问题

时间:2015-01-13 09:00:57

标签: java lucene

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

IndexSearcher已经针对每个搜索请求进行了实例化。

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

已使用RAMDirectory并且close方法未被记录。

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

以下是我的问题。

  1. 不在IndexReader上调用close方法有什么影响?
  2. 不在RAMDirectory上调用close方法有什么影响?
  3. 对索引阅读器的引用不会保留在任何地方。所以为了关闭它,我可以做IndexSearcher.ggetIndexReader()。close()吗?
  4. 是否有类似的方式来访问目录,以便在重新编制索引时可以关闭它?

1 个答案:

答案 0 :(得分:1)

Q>不在IndexReader上调用close方法有什么影响?
A>对于基于文件系统的索引,您可能会运行文件描述符。但是,如果所有IndexSearcherIndexReader都成为GCable,那么这不应该是一个大问题。也就是说,如果你不关心偶尔的内存峰值 - 但这取决于你的使用模式。

Q>不在RAMDirectory上调用close方法有什么影响?
A>内部地图无法清除。同样,如果你丢弃RAMDirectory的实例并重新创建它,那不是什么大不了的事。但我仍然关闭它以避免隐形错误并可能帮助GC。

Q>对索引阅读器的引用不会保留在任何地方。所以为了关闭它,我可以做IndexSearcher.getIndexReader().close()?
A>是的,创建IndexSearcher后,它始终会引用可以使用上述方法访问的原始IndexReader

Q>是否有类似的方式来访问目录,以便我可以在重新索引发生时关闭它? A>不。您打算保留此参考。