Lucene近实时搜索

时间:2017-07-24 08:21:41

标签: java lucene near-real-time

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

这里的问题是由于以下错误导致代码无法编译:{{1​​}}。

我应该如何更新The method openIfChanged(DirectoryReader) in the type DirectoryReader is not applicable for the arguments (IndexReader)

其次,如果我再次更新索引,我将需要另一个IndexReader实例,不是吗?在程序执行期间自由更新索引的最佳方法是在每次更新后切换2个IndexReader实例吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

尝试使用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进行索引操作。
  • 索引后提交

此外,您可以使用单独的线程定期提交,而不是每次写入,因为提交操作可能非常昂贵"。

此处示例:http://www.lucenetutorial.com/lucene-nrt-hello-world.html