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 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.
-
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(DirectoryReader reader, SearcherFactory searcherFactory) Creates and returns a new SearcherManager from an existingDirectoryReader.SearcherManager(IndexWriter writer, boolean applyAllDeletes, boolean writeAllDeletes, SearcherFactory searcherFactory) Expert: creates and returns a new SearcherManager from the givenIndexWriter, controlling whether past deletions should be applied.SearcherManager(IndexWriter writer, 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 voiddecRef(IndexSearcher reference) Decrement reference counting on the given reference.protected intgetRefCount(IndexSearcher reference) Returns the current reference count of the given reference.static IndexSearchergetSearcher(SearcherFactory searcherFactory, IndexReader reader, IndexReader previousReader) Expert: creates a searcher from the providedIndexReaderusing the providedSearcherFactory.booleanReturnstrueif no changes have occurred since this searcher ie.protected IndexSearcherrefreshIfNeeded(IndexSearcher referenceToRefresh) Refresh the given reference if needed.protected booleantryIncRef(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
Creates and returns a new SearcherManager from the givenIndexWriter.- Parameters:
writer- the IndexWriter to open the IndexReader from.searcherFactory- An optionalSearcherFactory. Passnullif 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 givenIndexWriter, controlling whether past deletions should be applied.- 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).writeAllDeletes- Iftrue, new deletes will be forcefully written to index files.searcherFactory- An optionalSearcherFactory. Passnullif 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. Passnullif 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 an existingDirectoryReader. Note that this steals the incoming reference.- Parameters:
reader- the DirectoryReader.searcherFactory- An optionalSearcherFactory. Passnullif 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:ReferenceManagerDecrement reference counting on the given reference.- Specified by:
decRefin classReferenceManager<IndexSearcher>- Throws:
IOException- if reference decrement on the given resource failed.
-
refreshIfNeeded
Description copied from class:ReferenceManagerRefresh the given reference if needed. Returnsnullif no refresh was needed, otherwise a new refreshed reference.- Specified by:
refreshIfNeededin classReferenceManager<IndexSearcher>- Throws:
IOException- if the refresh operation failed
-
tryIncRef
Description copied from class:ReferenceManagerTry to increment reference counting on the given reference. Return true if the operation was successful.- Specified by:
tryIncRefin classReferenceManager<IndexSearcher>
-
getRefCount
Description copied from class:ReferenceManagerReturns the current reference count of the given reference.- Specified by:
getRefCountin classReferenceManager<IndexSearcher>
-
isSearcherCurrent
Returnstrueif no changes have occurred since this searcher ie. reader was opened, otherwisefalse.- Throws:
IOException- See Also:
-
getSearcher
public static IndexSearcher getSearcher(SearcherFactory searcherFactory, IndexReader reader, IndexReader previousReader) throws IOException Expert: creates a searcher from the providedIndexReaderusing the providedSearcherFactory. NOTE: this decRefs incoming reader on throwing an exception.- Throws:
IOException
-