在使用Lucene Near实时索引功能时,是否需要关闭DirectoryReader

时间:2014-06-24 12:23:17

标签: java indexing solr lucene

使用Lucence 4.7.2并且是我的新手。我试着查看lucene源代码,但无法找到相关信息。使用接近实时的原因是,搜索索引时应该可以看到1分钟的创建时间。

我创建了以下尝试实现/使用lucene NRT(近实时)功能。

//Code to initialize IndexWriter and Near real-time IndexReader. 
//(DirectoryReader is used as IndexReader(IndexWriter, boolean) contructor is deprecated.
directory = FSDirectory.open(new File("C:/Users/arun/lucene-home/"));
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_47);
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_47, analyzer);
IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);

//NOTE 1
DirectoryReader directoryReader = DirectoryReader.open(indexWriter, true); 

根据 DirectoryReader openIfChanged(DirectoryReader oldReader, IndexWriter writer, boolean applyAllDeletes)

的文档

每次执行搜索之前,我都会创建IndexSearcher,如下所示

DirectoryReader newDirectoryReader = DirectoryReader.openIfChanged(directoryReader , indexWriter, true);
IndexSearcher nrtIndexSearcher = new IndexSearcher(newDirectoryreader);

问题:

原始的DirectoryReader" directoryReader&#34>在上面的代码中注明了注释"注1和#34; lucene本身关闭?我的意思是DirectoryReader实现或其中使用的类?

如果没有,如何在关闭DirectoryReader之前跟踪是否仍在引用从DirectoryReader创建的IndexSearcher。

注意:我将无法使用Solr,请原谅。

1 个答案:

答案 0 :(得分:2)

每个IndexReader必须在使用后关闭,否则您最终会遇到"Too many open files"例外。

如果您使用openIfChanged,则可以检查引用相等性以查看读者是否不同:

DirectoryReader oldReader = directoryReader;
DirectoryReader newReader = DirectoryReader.openIfChanged(directoryReader);
if ((newReader != null) & (oldReader != newReader)) {
   directoryReader = newReader;
   oldReader.close();
   // need to close the old one
} else {
   // nothing to do
}

注意:如果您在多线程环境中使用它,旧阅读器仍有可能仍在使用 - 所以如果您过早关闭它,使用旧阅读器(搜索者,使用此阅读器创建)的搜索将失败。解决此问题的方法是NRTManager和/或SearcherManager