Class SearcherManager

All Implemented Interfaces:
Closeable, AutoCloseable

public final class SearcherManager extends ReferenceManager<IndexSearcher>
Utility class to safely share IndexSearcher instances across multiple threads, while periodically reopening. This class ensures each searcher is closed only once all threads have finished using it.

Use ReferenceManager.acquire() to obtain the current searcher, and ReferenceManager.release(G) to release it, like this:

 IndexSearcher s = manager.acquire();
 try {
   // Do searching, doc retrieval, etc. with s
 } finally {
   manager.release(s);
 }
 // Do not use s after this!
 s = null;
 

In addition you should periodically call ReferenceManager.maybeRefresh(). While it's possible to call this just before running each query, this is discouraged since it penalizes the unlucky queries that need to refresh. It's better to use a separate background thread, that periodically calls ReferenceManager.maybeRefresh(). Finally, be sure to call ReferenceManager.close() once you are done.

See Also:
WARNING: This API is experimental and might change in incompatible ways in the next release.
  • Constructor Details

    • SearcherManager

      public SearcherManager(IndexWriter writer, SearcherFactory searcherFactory) throws IOException
      Creates and returns a new SearcherManager from the given IndexWriter.
      Parameters:
      writer - the IndexWriter to open the IndexReader from.
      searcherFactory - An optional SearcherFactory. Pass null if you don't require the searcher to be warmed before going live or other custom behavior.
      Throws:
      IOException - if there is a low-level I/O error
    • SearcherManager

      public SearcherManager(IndexWriter writer, boolean applyAllDeletes, boolean writeAllDeletes, SearcherFactory searcherFactory) throws IOException
      Expert: creates and returns a new SearcherManager from the given IndexWriter, controlling whether past deletions should be applied.
      Parameters:
      writer - the IndexWriter to open the IndexReader from.
      applyAllDeletes - If true, all buffered deletes will be applied (made visible) in the IndexSearcher / DirectoryReader. If false, the deletes may or may not be applied, but remain buffered (in IndexWriter) so that they will be applied in the future. Applying deletes can be costly, so if your app can tolerate deleted documents being returned you might gain some performance by passing false . See DirectoryReader.openIfChanged(DirectoryReader, IndexWriter, boolean).
      writeAllDeletes - If true, new deletes will be forcefully written to index files.
      searcherFactory - An optional SearcherFactory. Pass null if you don't require the searcher to be warmed before going live or other custom behavior.
      Throws:
      IOException - if there is a low-level I/O error
    • SearcherManager

      public SearcherManager(IndexWriter writer, boolean applyAllDeletes, boolean writeAllDeletes, SearcherFactory searcherFactory, RefreshCommitSupplier refreshCommitSupplier) throws IOException
      Expert: creates and returns a new SearcherManager from the given IndexWriter, controlling whether past deletions should be applied.
      Parameters:
      writer - the IndexWriter to open the IndexReader from.
      applyAllDeletes - If true, all buffered deletes will be applied (made visible) in the IndexSearcher / DirectoryReader. If false, the deletes may or may not be applied, but remain buffered (in IndexWriter) so that they will be applied in the future. Applying deletes can be costly, so if your app can tolerate deleted documents being returned you might gain some performance by passing false . See DirectoryReader.openIfChanged(DirectoryReader, IndexWriter, boolean).
      writeAllDeletes - If true, new deletes will be forcefully written to index files.
      searcherFactory - An optional SearcherFactory. Pass null if you don't require the searcher to be warmed before going live or other custom behavior.
      refreshCommitSupplier - supplier for providing the commit to refresh on
      Throws:
      IOException - if there is a low-level I/O error
    • SearcherManager

      public SearcherManager(Directory dir, SearcherFactory searcherFactory) throws IOException
      Creates and returns a new SearcherManager from the given Directory.
      Parameters:
      dir - the directory to open the DirectoryReader on.
      searcherFactory - An optional SearcherFactory. Pass null if you don't require the searcher to be warmed before going live or other custom behavior.
      Throws:
      IOException - if there is a low-level I/O error
    • SearcherManager

      public SearcherManager(DirectoryReader reader, SearcherFactory searcherFactory) throws IOException
      Creates and returns a new SearcherManager from an existing DirectoryReader. Note that this steals the incoming reference.
      Parameters:
      reader - the DirectoryReader.
      searcherFactory - An optional SearcherFactory. Pass null if you don't require the searcher to be warmed before going live or other custom behavior.
      Throws:
      IOException - if there is a low-level I/O error
    • SearcherManager

      public SearcherManager(DirectoryReader reader, SearcherFactory searcherFactory, RefreshCommitSupplier refreshCommitSupplier) throws IOException
      Creates and returns a new SearcherManager from an existing DirectoryReader. Note that this steals the incoming reference.
      Parameters:
      reader - the DirectoryReader.
      searcherFactory - An optional SearcherFactory. Pass null if you don't require the searcher to be warmed before going live or other custom behavior.
      refreshCommitSupplier - supplier for providing the commit to refresh on
      Throws:
      IOException - if there is a low-level I/O error
  • Method Details