Lucene 将IndexWriter与SearchManager一起使用
关于将SearcherManager与IndexWriter一起使用,我有几个基本问题 我需要定期在应用程序中重新构建Lucene索引,目前它发生在不同的线程上,而不是服务于搜索请求的线程上Lucene 将IndexWriter与SearchManager一起使用,lucene,Lucene,关于将SearcherManager与IndexWriter一起使用,我有几个基本问题 我需要定期在应用程序中重新构建Lucene索引,目前它发生在不同的线程上,而不是服务于搜索请求的线程上 我可以在应用程序的整个生命周期中使用相同的IndexWriter实例定期重建索引吗?目前,我在启动期间创建/打开它一次,只要在构建新索引时调用IndexWriter#commit 我正在使用SearcherManager获取并发布每个搜索请求的IndexSearcher实例。定期构建索引后,我计划使用sea
IndexWriter#commit
SearcherManager
获取并发布每个搜索请求的IndexSearcher
实例。定期构建索引后,我计划使用searchermanger#maybeRefresh
方法刷新IndexSearcher
实例。searchermanger实例在启动期间也会创建一次,我打算一直维护它李>
IndexWriter
或SearcherManager
SearcherManager#maybeRefresh
是否能够检测到它是一个新的IndexWriter实例?还是需要使用新创建的IndexWriter创建新的SearcherManagerIndexWriter
创建SearcherManager
实例、使用DirectoryReader
创建实例和使用目录创建实例之间有什么区别
答案取决于您如何构建SearcherManager: 如果使用DirectoryReader构建它,则从SearcherManager获取的所有未来IndexSearcher都将基于该阅读器,即所有搜索都将提供您实例化SearcherManager的时间点的结果。如果将数据写入索引/目录,然后运行
SearcherManager.maybeRefresh()
,则读卡器将不会更新,搜索结果将过时
如果使用IndexWriter构建SearcherManager,SearcherManager.maybeRefresh()
将更新SearcherManager的读卡器(如果写入者已写入和提交数据)。所有新收购的IndexSearcher将反映基础指数的新状态
尽管经验有限,我还是建议使用后一种方法。它提供了一种非常简单的实现方法:在应用程序启动时,您创建一个IndexWriter并用它构造一个SearcherManager。然后启动一个后台线程,定期提交IndexWriter中的所有更改并刷新SearcherManager。在应用程序的生命周期中,您可以继续使用初始IndexWriter和SearcherManager,而无需关闭/重新打开它们
PS:我几天前才开始与Lucene合作,所以不要认为我在这里写的所有东西都是100%确定的