Package org.apache.lucene.search
Class SearcherManager
- All Implemented Interfaces:
Closeable
,AutoCloseable
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 do the reopen. It's better to use
a separate background thread, that periodically calls maybeReopen. Finally,
be sure to call ReferenceManager.close()
once you are done.
- See Also:
-
Nested Class Summary
Nested classes/interfaces inherited from class org.apache.lucene.search.ReferenceManager
ReferenceManager.RefreshListener
-
Field Summary
Fields inherited from class org.apache.lucene.search.ReferenceManager
current
-
Constructor Summary
ConstructorsConstructorDescriptionSearcherManager
(IndexWriter writer, boolean applyAllDeletes, SearcherFactory searcherFactory) Creates and returns a new SearcherManager from the givenIndexWriter
.SearcherManager
(Directory dir, SearcherFactory searcherFactory) Creates and returns a new SearcherManager from the givenDirectory
. -
Method Summary
Modifier and TypeMethodDescriptionprotected void
decRef
(IndexSearcher reference) Decrement reference counting on the given reference.protected int
getRefCount
(IndexSearcher reference) Returns the current reference count of the given reference.static IndexSearcher
getSearcher
(SearcherFactory searcherFactory, IndexReader reader) Expert: creates a searcher from the providedIndexReader
using the providedSearcherFactory
.boolean
Returnstrue
if no changes have occured since this searcher ie.protected IndexSearcher
refreshIfNeeded
(IndexSearcher referenceToRefresh) Refresh the given reference if needed.protected boolean
tryIncRef
(IndexSearcher reference) Try to increment reference counting on the given reference.Methods inherited from class org.apache.lucene.search.ReferenceManager
acquire, addListener, afterClose, afterMaybeRefresh, close, maybeRefresh, maybeRefreshBlocking, release, removeListener
-
Constructor Details
-
SearcherManager
public SearcherManager(IndexWriter writer, boolean applyAllDeletes, SearcherFactory searcherFactory) throws IOException Creates and returns a new SearcherManager from the givenIndexWriter
.- Parameters:
writer
- the IndexWriter to open the IndexReader from.applyAllDeletes
- Iftrue
, all buffered deletes will be applied (made visible) in theIndexSearcher
/DirectoryReader
. Iffalse
, 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 passingfalse
. SeeDirectoryReader.openIfChanged(DirectoryReader, IndexWriter, boolean)
.searcherFactory
- An optionalSearcherFactory
. Passnull
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
Creates and returns a new SearcherManager from the givenDirectory
.- Parameters:
dir
- the directory to open the DirectoryReader on.searcherFactory
- An optionalSearcherFactory
. Passnull
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
-
-
Method Details
-
decRef
Description copied from class:ReferenceManager
Decrement reference counting on the given reference.- Specified by:
decRef
in classReferenceManager<IndexSearcher>
- Throws:
IOException
- if reference decrement on the given resource failed.
-
refreshIfNeeded
Description copied from class:ReferenceManager
Refresh the given reference if needed. Returnsnull
if no refresh was needed, otherwise a new refreshed reference.- Specified by:
refreshIfNeeded
in classReferenceManager<IndexSearcher>
- Throws:
IOException
- if the refresh operation failed
-
tryIncRef
Description copied from class:ReferenceManager
Try to increment reference counting on the given reference. Return true if the operation was successful.- Specified by:
tryIncRef
in classReferenceManager<IndexSearcher>
-
getRefCount
Description copied from class:ReferenceManager
Returns the current reference count of the given reference.- Specified by:
getRefCount
in classReferenceManager<IndexSearcher>
-
isSearcherCurrent
Returnstrue
if no changes have occured since this searcher ie. reader was opened, otherwisefalse
.- Throws:
IOException
- See Also:
-
getSearcher
public static IndexSearcher getSearcher(SearcherFactory searcherFactory, IndexReader reader) throws IOException Expert: creates a searcher from the providedIndexReader
using the providedSearcherFactory
. NOTE: this decRefs incoming reader on throwing an exception.- Throws:
IOException
-