在SearchManager中使用IndexWriter
关于SearcherManager在IndexWriter中的用法,我有几个基本问题。在SearchManager中使用IndexWriter
我需要定期在应用程序中重新构建Lucene索引,目前它发生在除提供搜索请求的线程以外的其他线程中。
- 我可以在应用程序的生命周期中使用相同的IndexWriter实例来定期重建索引吗?目前,我在创业期间创建/打开一次,每当建立新索引时致电
IndexWriter#commit
。 - 我正在使用
SearcherManager
来为每个搜索请求获取并发布IndexSearcher
实例。在定期建立索引之后,我打算使用SearcherManager#maybeRefresh
方法来刷新IndexSearcher
实例.SearcherManager实例在启动过程中也会创建一次,并且我打算彻底维护它。 - 在整个应用程序的整个生命周期中,我都没有关闭
IndexWriter
或SearcherManager
。
现在的问题,
- 如果我每一次我需要重建索引的时间创建一个新的IndexWriter,将
SearcherManager#maybeRefresh
能够检测到,这是一个新的IndexWriter实例?或者我需要使用新创建的IndexWriter创建一个新的SearcherManager? - 什么用
IndexWriter
创建SearcherManager
例如,使用DirectoryReader
或使用Directory
创建它创造的区别吧?
回答:
这些问题的答案取决于你如何构建你的SearcherManager:
如果您有DirectoryReader,从SearcherManager获得的所有未来IndexSearchers将根据该读者构造它,即所有搜索将从实例化SearcherManager的时间点提供结果。如果您将数据写入索引/目录并在之后运行SearcherManager.maybeRefresh()
,读卡器将不会更新,并且您的搜索结果将过期。
如果构建SearcherManager时使用IndexWriter,SearcherManager.maybeRefresh()
将更新SearcherManager的阅读器(如果数据已被写入器写入并提交)。所有新近收购的IndexSearchers将会反映潜在指数的新状态。
尽管经验有限,我推荐使用后一种方法。它提供了一个非常简单的方法来实现near-real-time searching:在应用程序启动时,您创建一个IndexWriter并用它构造一个SearcherManager。之后,您将开始一个后台线程,该线程定期提交IndexWriter中的所有更改并刷新SearcherManager。对于应用程序的生命周期,您可以继续使用初始的IndexWriter和SearcherManager,而无需关闭/重新打开它们。
PS:我才开始使用Lucene工作前几天,所以不要采取一切,我在这里写下的100%确定。
以上是 在SearchManager中使用IndexWriter 的全部内容, 来源链接: utcz.com/qa/266387.html