gpt4 book ai didi

java - 使用 Lucene 近实时索引功能时是否需要关闭 DirectoryReader

转载 作者:行者123 更新时间:2023-11-30 03:51:16 28 4
gpt4 key购买 nike

我正在使用 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);

问题:

上述代码中注释“NOTE 1”的原始DirectoryReader“directoryReader”会被lucene本身关闭吗?我的意思是 DirectoryReader 实现或其中使用的类?

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

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

最佳答案

每个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

关于java - 使用 Lucene 近实时索引功能时是否需要关闭 DirectoryReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24386554/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com