public final class SearcherManager extends ReferenceManager<IndexSearcher>
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.
SearcherFactory
ReferenceManager.RefreshListener
current
Constructor and Description |
---|
SearcherManager(DirectoryReader reader,
SearcherFactory searcherFactory)
Creates and returns a new SearcherManager from an existing
DirectoryReader . |
SearcherManager(Directory dir,
SearcherFactory searcherFactory)
Creates and returns a new SearcherManager from the given
Directory . |
SearcherManager(IndexWriter writer,
boolean applyAllDeletes,
boolean writeAllDeletes,
SearcherFactory searcherFactory)
Expert: creates and returns a new SearcherManager from the given
IndexWriter , controlling whether past deletions should be applied. |
SearcherManager(IndexWriter writer,
SearcherFactory searcherFactory)
Creates and returns a new SearcherManager from the given
IndexWriter . |
Modifier and Type | Method and Description |
---|---|
protected 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,
IndexReader previousReader)
Expert: creates a searcher from the provided
IndexReader using the provided SearcherFactory . |
boolean |
isSearcherCurrent()
Returns
true 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.
|
acquire, addListener, afterClose, afterMaybeRefresh, close, maybeRefresh, maybeRefreshBlocking, release, removeListener
public SearcherManager(IndexWriter writer, SearcherFactory searcherFactory) throws IOException
IndexWriter
.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.IOException
- if there is a low-level I/O errorpublic SearcherManager(IndexWriter writer, boolean applyAllDeletes, boolean writeAllDeletes, SearcherFactory searcherFactory) throws IOException
IndexWriter
, controlling whether past deletions should be applied.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.IOException
- if there is a low-level I/O errorpublic SearcherManager(Directory dir, SearcherFactory searcherFactory) throws IOException
Directory
.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.IOException
- if there is a low-level I/O errorpublic SearcherManager(DirectoryReader reader, SearcherFactory searcherFactory) throws IOException
DirectoryReader
. Note that
this steals the incoming reference.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.IOException
- if there is a low-level I/O errorprotected void decRef(IndexSearcher reference) throws IOException
ReferenceManager
decRef
in class ReferenceManager<IndexSearcher>
IOException
- if reference decrement on the given resource failed.protected IndexSearcher refreshIfNeeded(IndexSearcher referenceToRefresh) throws IOException
ReferenceManager
null
if no refresh
was needed, otherwise a new refreshed reference.refreshIfNeeded
in class ReferenceManager<IndexSearcher>
IOException
- if the refresh operation failedprotected boolean tryIncRef(IndexSearcher reference)
ReferenceManager
tryIncRef
in class ReferenceManager<IndexSearcher>
protected int getRefCount(IndexSearcher reference)
ReferenceManager
getRefCount
in class ReferenceManager<IndexSearcher>
public boolean isSearcherCurrent() throws IOException
true
if no changes have occured since this searcher
ie. reader was opened, otherwise false
.IOException
DirectoryReader.isCurrent()
public static IndexSearcher getSearcher(SearcherFactory searcherFactory, IndexReader reader, IndexReader previousReader) throws IOException
IndexReader
using the provided SearcherFactory
. NOTE: this decRefs incoming reader
on throwing an exception.IOException
Copyright © 2000-2017 Apache Software Foundation. All Rights Reserved.