Lucene 接近实时搜索
Lucene near real time search
我正在使用 Lucene 6.6.0,我想使用 Lucene 的近乎实时的搜索功能。但是,我无法实施它。我尝试获取功能的方式如下:
我初始化一个 IndexReader 实例:
this.reader = DirectoryReader.open(this.directory);
让我们假设已通过 IndexWriter 实例对索引进行了一些更改。然后,如果我理解正确的话,我需要第二个 IndexReader 实例来提交更新:
this.newReader = DirectoryReader.openIfChanged(this.reader);
if (this.newReader != null) {
// Update the IndexSearcher with the new IndexReader instance
this.searcher = new IndexSearcher(this.newReader);
this.reader.close();
}
这里的问题是由于以下错误代码无法编译:The method openIfChanged(DirectoryReader) in the type DirectoryReader is not applicable for the arguments (IndexReader)
.
那我应该如何更新 IndexReader
?
其次,如果我再次更新索引,我将需要另一个 IndexReader 实例,不是吗?在程序执行期间自由更新索引的最佳方法是在每次更新后在 2 个 IndexReader 实例之间切换吗?
谢谢。
尝试使用 SearcherManager 而不是 IndexReader:
http://lucene.apache.org/core/6_6_0/core/org/apache/lucene/search/SearcherManager.html
基于 SearcherManager,您可以执行以下方法:
// get a IndexSearcher for searching
IndexSearcher searcher = searcherManager.aquire();
// release IndexSearcher after search
searcherManager.release(searcher);
// refresh and add new index records to next search. usually after a commit
searcherManager.maybeRefresh();
我也尝试实现这个,基本上我是这样做的:
- 创建一个 IndexWriter 并保持打开状态
- 使用 IndexWriter 作为参数创建 SearcherManager。
- 使用 SearcherManager 进行搜索
- 使用 IndexWriter 进行索引操作。
- 索引后提交
此外,您可以使用单独的线程定期提交而不是每次写入时提交,因为提交操作可能很漂亮 "expensive"。
此处示例:http://www.lucenetutorial.com/lucene-nrt-hello-world.html
我正在使用 Lucene 6.6.0,我想使用 Lucene 的近乎实时的搜索功能。但是,我无法实施它。我尝试获取功能的方式如下:
我初始化一个 IndexReader 实例:
this.reader = DirectoryReader.open(this.directory);
让我们假设已通过 IndexWriter 实例对索引进行了一些更改。然后,如果我理解正确的话,我需要第二个 IndexReader 实例来提交更新:
this.newReader = DirectoryReader.openIfChanged(this.reader);
if (this.newReader != null) {
// Update the IndexSearcher with the new IndexReader instance
this.searcher = new IndexSearcher(this.newReader);
this.reader.close();
}
这里的问题是由于以下错误代码无法编译:The method openIfChanged(DirectoryReader) in the type DirectoryReader is not applicable for the arguments (IndexReader)
.
那我应该如何更新 IndexReader
?
其次,如果我再次更新索引,我将需要另一个 IndexReader 实例,不是吗?在程序执行期间自由更新索引的最佳方法是在每次更新后在 2 个 IndexReader 实例之间切换吗?
谢谢。
尝试使用 SearcherManager 而不是 IndexReader: http://lucene.apache.org/core/6_6_0/core/org/apache/lucene/search/SearcherManager.html
基于 SearcherManager,您可以执行以下方法:
// get a IndexSearcher for searching
IndexSearcher searcher = searcherManager.aquire();
// release IndexSearcher after search
searcherManager.release(searcher);
// refresh and add new index records to next search. usually after a commit
searcherManager.maybeRefresh();
我也尝试实现这个,基本上我是这样做的:
- 创建一个 IndexWriter 并保持打开状态
- 使用 IndexWriter 作为参数创建 SearcherManager。
- 使用 SearcherManager 进行搜索
- 使用 IndexWriter 进行索引操作。
- 索引后提交
此外,您可以使用单独的线程定期提交而不是每次写入时提交,因为提交操作可能很漂亮 "expensive"。
此处示例:http://www.lucenetutorial.com/lucene-nrt-hello-world.html