使用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);
的文档
每次执行搜索之前,我都会创建IndexSearcher,如下所示
DirectoryReader newDirectoryReader = DirectoryReader.openIfChanged(directoryReader , indexWriter, true);
IndexSearcher nrtIndexSearcher = new IndexSearcher(newDirectoryreader);
问题:
原始的DirectoryReader" directoryReader&#34>在上面的代码中注明了注释"注1和#34; lucene本身关闭?我的意思是DirectoryReader实现或其中使用的类?
如果没有,如何在关闭DirectoryReader之前跟踪是否仍在引用从DirectoryReader创建的IndexSearcher。
注意:我将无法使用Solr,请原谅。
答案 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
。