lucene3.5中,对于其近实时搜索,主要包括了两个核心的东西,
NRTManager,
SearcherManager,记录下本身的理解和认知。。。。。。
构建NRTManager,利用NRTManager,SearcherManager来实现近实时搜索
其原理是:
首先要说明2个问题,实时搜索包含两部分:
1可以将索引实时的提交commit,也就是咱们用到的IndexWriter对象的commit()操做
2.可以将实时变化的索引信息经过搜索展示出来,也就是咱们用到的IndexSearcher类的getSearcher()方法。
实时更新:lucene3.5中,利用NRTManager来管理IndexWriter,经过暴露indexWriter的一些内部的方法,如增删改查索引等,其操做全在内存里面,可是其自身对索引的上述操做的方法里,并无commit操做, 因此咱们若是不手动的调用commit操做的话,经过以上的操做,咱们真实存放的索引库是不会变化的,因此咱们经过NRTManager暴露出来的那些方法操做时,最后要进行commit,这样就会完成了实时更新。
实时查询:要想获取用户最新的索引信息,咱们能够经过lucene3.5提供的另外一个查询对象SearcherManager类来实现,咱们是能够经过SearcherManager类获取Indexsearch的,能够经过调用其maybeReopen()方法来实现最新的索引搜索对象。 NRTManager对象提供了获取SearcherManager的方法,而且也提供了maybeReopen方法,那么咱们要达到目的,确定是咱们本身来有时间间隔的循环调用maybeReopen来查询最新的查询, 而lucene3.5里,给咱们提供了一个后台线程类,叫作NRTManagerReopenThread线程类,该线程负责实时跟踪索引的内存变化,索引的每次变化其就会自动调用maybeReopen方法,保持最新的索引信息,经过每次变化就调用 maybeReopen方法,来获取最新的IndexSearcher对象,而咱们所要的IndexSearcher对象就是NRTManager经过调用getSearcherManager方法得到SearcherManager对象,而后经过SearcherManager对象获取IndexSearcher对象
NRTManager->getSearcherManager()->SearcherManager->acquire()->IndexSearcher
最后调用SearcherManager的release释放IndexSearcher对象,而且要关闭NRTManagerReopenThread