关于SearcherManager与IndexWriter的使用,我有几个基本问题。
我需要定期在应用程序中重新构建Lucene索引,目前它发生在不同于提供搜索请求的线程的其他线程上。
IndexWriter#commit
。SearcherManager
为每个搜索请求获取和释放IndexSearcher
个实例。在定期构建索引之后,我计划使用SearcherManager#maybeRefresh
方法来刷新IndexSearcher
实例。在启动期间也会创建一次查询管理器实例,并且我打算将其维护。 IndexWriter
或SearcherManager
。现在提出问题,
SearcherManager#maybeRefresh
是否能够检测到它是一个新的IndexWriter实例?或者我是否需要使用新创建的IndexWriter创建新的SearcherManager?SearcherManager
创建IndexWriter
实例,使用DirectoryReader
创建实例或使用Directory
创建实例有什么区别?答案 0 :(得分:1)
答案取决于您构建 SearcherManager :
的方式如果使用 DirectoryReader 构建它,则从SearcherManager获取的所有未来IndexSearchers都将基于该读取器,即所有搜索都将提供您实例化SearcherManager的时间点的结果。如果您将数据写入索引/目录并在之后运行SearcherManager.maybeRefresh()
,则不会更新阅读器,并且您的搜索结果将过时。
如果使用 IndexWriter 构建SearcherManager,SearcherManager.maybeRefresh()
将更新SearcherManager的读取器,如果数据已由作者写入并提交。然后,所有新获得的IndexSearchers将反映基础指数的新状态。
尽管经验有限,但我建议使用后一种方法。它提供了一种非常简单的方法来实现near-real-time searching:在应用程序启动时,您创建一个IndexWriter并使用它构造一个SearcherManager。然后启动后台线程,定期提交IndexWriter中的所有更改并刷新SearcherManager。在应用程序的生命周期中,您可以继续使用初始的IndexWriter和SearcherManager,而无需关闭/重新打开它们。
PS :我几天前才开始与Lucene合作,所以不要把我在这里写的所有内容都视为100%肯定。