当我的搜索服务器开始运行时,它会立即为所有查询加载所有索引。但是,即使重建索引,它仍然使用旧索引。所以我认为我应该告诉搜索器的indexReader在服务器重建索引后重新打开索引,但是如何实现呢? 也许使用生产者 - 消费者模式?虽然我可以使用indexReader.isCurrent()来检查索引是否已经更改,但我必须经常检查这个搜索或在某个时间段。有没有更有效和实时的方式?
答案 0 :(得分:6)
执行所描述的方便的方法是使用Lucene的帮助程序类SearcherManager。如果您有兴趣进行近实时搜索,您可能也会对NRTManager感兴趣。
关于Mike McCandless' blog上的这两个类,有一篇非常好的博客文章。
答案 1 :(得分:0)
这绝不是一项简单的任务。我不得不编写了很多代码来实现它(不幸的是,它是在Clojure中,所以手头没有Java代码示例)。基本原则是对IndexSearcher提供线程安全引用,索引读取代码和索引构建代码都可以访问它。索引构建器开始在后台创建新索引;这不会干扰现有的索引。完成后,它进入synchronized块,关闭IndexReader和IndexSearcher,打开一个新的IndexReader,并更新对从它创建的IndexSearcher的全局IndexSearcher引用。所有读取代码必须在与所提到的同步块中涉及的锁相同的锁上同步。更好的选择是使用ReentrantReadWriteLock而不是synchronized块。这样可以避免许多读者线程之间不必要的争用。
初始化后,在正常操作期间,您可以使用NRTManager同时读取索引并对其进行增量更新。