Show / Hide Table of Contents

    Class SearcherLifetimeManager

    Keeps track of current plus old IndexSearchers, disposing the old ones once they have timed out.

    Use it like this:

        SearcherLifetimeManager mgr = new SearcherLifetimeManager();

    Per search-request, if it's a "new" search request, then obtain the latest searcher you have (for example, by using SearcherManager), and then record this searcher:

        // Record the current searcher, and save the returend
        // token into user's search results (eg as a  hidden
        // HTML form field):
        long token = mgr.Record(searcher);

    When a follow-up search arrives, for example the user clicks next page, drills down/up, etc., take the token that you saved from the previous search and:

        // If possible, obtain the same searcher as the last
        // search:
        IndexSearcher searcher = mgr.Acquire(token);
        if (searcher != null) 
        {
            // Searcher is still here
            try 
            {
                // do searching...
            } 
            finally 
            {
                mgr.Release(searcher);
                // Do not use searcher after this!
                searcher = null;
            }
        } 
        else 
        {
            // Searcher was pruned -- notify user session timed
            // out, or, pull fresh searcher again
        }

    Finally, in a separate thread, ideally the same thread that's periodically reopening your searchers, you should periodically prune old searchers:

        mgr.Prune(new PruneByAge(600.0));

    NOTE: keeping many searchers around means you'll use more resources (open files, RAM) than a single searcher. However, as long as you are using OpenIfChanged(DirectoryReader), the searchers will usually share almost all segments and the added resource usage is contained. When a large merge has completed, and you reopen, because that is a large change, the new searcher will use higher additional RAM than other searchers; but large merges don't complete very often and it's unlikely you'll hit two of them in your expiration window. Still you should budget plenty of heap in the runtime to have a good safety margin.

    Inheritance
    System.Object
    SearcherLifetimeManager
    Namespace: Lucene.Net.Search
    Assembly: Lucene.Net.dll
    Syntax
    public class SearcherLifetimeManager : IDisposable

    Methods

    | Improve this Doc View Source

    Acquire(Int64)

    Retrieve a previously recorded IndexSearcher, if it has not yet been closed.

    NOTE: this may return null when the requested searcher has already timed out. When this happens you should notify your user that their session timed out and that they'll have to restart their search.

    If this returns a non-null result, you must match later call Release(IndexSearcher) on this searcher, best from a finally clause.

    Declaration
    public virtual IndexSearcher Acquire(long version)
    Parameters
    Type Name Description
    System.Int64 version
    Returns
    Type Description
    IndexSearcher
    | Improve this Doc View Source

    Dispose()

    Close this to future searching; any searches still in process in other threads won't be affected, and they should still call Release(IndexSearcher) after they are done.

    NOTE: you must ensure no other threads are calling Record(IndexSearcher) while you call Dispose(); otherwise it's possible not all searcher references will be freed.

    Declaration
    public virtual void Dispose()
    | Improve this Doc View Source

    Prune(SearcherLifetimeManager.IPruner)

    Calls provided SearcherLifetimeManager.IPruner to prune entries. The entries are passed to the SearcherLifetimeManager.IPruner in sorted (newest to oldest IndexSearcher) order.

    NOTE: you must peridiocally call this, ideally from the same background thread that opens new searchers.

    Declaration
    public virtual void Prune(SearcherLifetimeManager.IPruner pruner)
    Parameters
    Type Name Description
    SearcherLifetimeManager.IPruner pruner
    | Improve this Doc View Source

    Record(IndexSearcher)

    Records that you are now using this IndexSearcher. Always call this when you've obtained a possibly new IndexSearcher, for example from SearcherManager. It's fine if you already passed the same searcher to this method before.

    This returns the token that you can later pass to Acquire(Int64) to retrieve the same IndexSearcher. You should record this token in the search results sent to your user, such that if the user performs a follow-on action (clicks next page, drills down, etc.) the token is returned.

    Declaration
    public virtual long Record(IndexSearcher searcher)
    Parameters
    Type Name Description
    IndexSearcher searcher
    Returns
    Type Description
    System.Int64
    | Improve this Doc View Source

    Release(IndexSearcher)

    Release a searcher previously obtained from Acquire(Int64).

    NOTE: it's fine to call this after Dispose().

    Declaration
    public virtual void Release(IndexSearcher s)
    Parameters
    Type Name Description
    IndexSearcher s
    • Improve this Doc
    • View Source
    Back to top Copyright © 2020 Licensed to the Apache Software Foundation (ASF)