Lucene 将IndexWriter与SearchManager一起使用

Lucene 将IndexWriter与SearchManager一起使用,lucene,Lucene,关于将SearcherManager与IndexWriter一起使用,我有几个基本问题 我需要定期在应用程序中重新构建Lucene索引,目前它发生在不同的线程上,而不是服务于搜索请求的线程上 我可以在应用程序的整个生命周期中使用相同的IndexWriter实例定期重建索引吗?目前,我在启动期间创建/打开它一次,只要在构建新索引时调用IndexWriter#commit 我正在使用SearcherManager获取并发布每个搜索请求的IndexSearcher实例。定期构建索引后,我计划使用sea

关于将SearcherManager与IndexWriter一起使用,我有几个基本问题

我需要定期在应用程序中重新构建Lucene索引,目前它发生在不同的线程上,而不是服务于搜索请求的线程上

  • 我可以在应用程序的整个生命周期中使用相同的IndexWriter实例定期重建索引吗?目前,我在启动期间创建/打开它一次,只要在构建新索引时调用
    IndexWriter#commit
  • 我正在使用
    SearcherManager
    获取并发布每个搜索请求的
    IndexSearcher
    实例。定期构建索引后,我计划使用
    searchermanger#maybeRefresh
    方法刷新
    IndexSearcher
    实例。searchermanger实例在启动期间也会创建一次,我打算一直维护它
  • 在应用程序的整个生命周期内,我不会关闭
    IndexWriter
    SearcherManager
  • 现在回答问题,

  • 如果每次需要重建索引时都创建一个新的IndexWriter,
    SearcherManager#maybeRefresh
    是否能够检测到它是一个新的IndexWriter实例?还是需要使用新创建的IndexWriter创建新的SearcherManager
  • 使用
    IndexWriter
    创建
    SearcherManager
    实例、使用
    DirectoryReader
    创建实例和使用
    目录创建实例之间有什么区别

  • 答案取决于您如何构建SearcherManager

    如果使用DirectoryReader构建它,则从SearcherManager获取的所有未来IndexSearcher都将基于该阅读器,即所有搜索都将提供您实例化SearcherManager的时间点的结果。如果将数据写入索引/目录,然后运行
    SearcherManager.maybeRefresh()
    ,则读卡器将不会更新,搜索结果将过时

    如果使用IndexWriter构建SearcherManager
    SearcherManager.maybeRefresh()
    将更新SearcherManager的读卡器(如果写入者已写入和提交数据)。所有新收购的IndexSearcher将反映基础指数的新状态

    尽管经验有限,我还是建议使用后一种方法。它提供了一种非常简单的实现方法:在应用程序启动时,您创建一个IndexWriter并用它构造一个SearcherManager。然后启动一个后台线程,定期提交IndexWriter中的所有更改并刷新SearcherManager。在应用程序的生命周期中,您可以继续使用初始IndexWriter和SearcherManager,而无需关闭/重新打开它们


    PS:我几天前才开始与Lucene合作,所以不要认为我在这里写的所有东西都是100%确定的