将IndexWriter与SearchManager一起使用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将IndexWriter与SearchManager一起使用相关的知识,希望对你有一定的参考价值。

关于SearcherManager与IndexWriter的使用,我有几个基本问​​题。

我需要定期在应用程序中重新构建Lucene索引,并且当前它发生在除提供搜索请求的线程之外的其他线程上。

  1. 我可以在应用程序的生命周期内使用相同的IndexWriter实例来定期重建索引吗?目前,我在启动期间创建/打开一次,只要在构建新索引时调用IndexWriter#commit
  2. 我正在使用SearcherManagerto获取并释放每个搜索请求的IndexSearcher实例。在定期构建索引之后,我打算使用SearcherManager#maybeRefresh方法来获取刷新的IndexSearcher实例。在启动期间也会创建一次查询管理器实例,我打算将其维护。
  3. 我不会在应用程序的整个生命周期中关闭IndexWriterSearcherManager

现在提问,

  1. 如果我每次需要重建索引时都创建一个新的IndexWriter,那么SearcherManager#maybeRefresh能否检测到它是一个新的IndexWriter实例?或者我是否需要使用新创建的IndexWriter创建新的SearcherManager?
  2. 使用SearcherManager创建IndexWriter实例,使用DirectoryReader创建它或使用Directory创建它有什么区别?
答案

答案取决于您构建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%肯定。

以上是关于将IndexWriter与SearchManager一起使用的主要内容,如果未能解决你的问题,请参考以下文章

org.apache.lucene.store.AlreadyClosedException:此IndexWriter已关闭

搜索引擎系列五:Lucene索引详解(IndexWriter详解Document详解索引更新)

学习lucene5.5.4的笔记

Lucene初探之索引过程分析

Lucene初探之索引过程分析

创建索引之代码开发