lucene:索引后重新打开indexreader

lucene:索引后重新打开indexreader,lucene,Lucene,当我的搜索服务器开始运行时,它将一次加载所有查询的所有索引。但是,即使我重建了索引,它仍然使用旧索引。所以我认为我应该告诉searcher的indexReader在服务器重建索引后重新打开索引,但是如何实现它呢? 也许使用生产者-消费者模式?虽然我可以使用indexReader.isCurrent()检查索引是否已更改,但我必须在每次搜索或某个时间段检查此项。有没有更高效、实时的方法 一种方便的方法是使用Lucene的helper类。如果您对进行近实时搜索感兴趣,您也可能对以下内容感兴趣 上有一

当我的搜索服务器开始运行时,它将一次加载所有查询的所有索引。但是,即使我重建了索引,它仍然使用旧索引。所以我认为我应该告诉searcher的indexReader在服务器重建索引后重新打开索引,但是如何实现它呢?
也许使用生产者-消费者模式?虽然我可以使用indexReader.isCurrent()检查索引是否已更改,但我必须在每次搜索或某个时间段检查此项。有没有更高效、实时的方法

一种方便的方法是使用Lucene的helper类。如果您对进行近实时搜索感兴趣,您也可能对以下内容感兴趣


上有一篇关于这两个类的非常好的博客文章。

这绝不是一项简单的任务。我必须编写大量代码才能实现它(不幸的是,它是在Clojure中编写的,所以手头没有Java代码示例)。基本原则是对IndexSearcher有一个线程安全的引用,索引读取代码和索引构建代码都可以访问该引用。索引生成器开始在后台创建新索引;这不会干扰现有索引。完成后,它进入一个同步块,关闭IndexReader和IndexSearcher,打开一个新的IndexReader,并将全局IndexSearcher引用更新为从中创建的IndexSearcher。所有读取代码必须在与所述同步块中涉及的锁相同的锁上同步。更好的替代方法是使用ReentrantReadWriteLock而不是同步块。这将避免许多读卡器线程之间不必要的争用

初始化后,在正常操作期间,可以使用NRTManager同时读取索引并对其进行增量更新