lucene-java-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ivan cruces <>
Subject Custom pruning strategy with SearcherLifetimeManager
Date Fri, 24 Nov 2017 09:17:23 GMT

I am using SearcherLifetimeManager to implement pagination. The built-in
pruner PruneByAge doesn’t fit in my application as it doesn’t take into
account the last time each searcher was used.

I am trying to imlement a custom pruning strategy that prunes a searcher
based on the last time it was used. To do that I am implementing the
SearcherLifetimeManager.Pruner interface and I am using a Map to keep track
of the last used time of each searcher using the token returned by the
record method as a key:

private final SearcherLifetimeManager slm = new SearcherLifetimeManager();

public long record(IndexSearcher searcher) throws IOException {
        long token = this.slm.record(searcher);
        lastUsedTime.put(token, System.currentTimeMillis());
        return readerVersion;

public void release(IndexSearcher searcher) throws IOException {
    lastUsedTime.put(token, System.currentTimeMillis());

Unfortunatelly, the doPrune method in the Pruner interface doesn’t get the
searcher token as a parameter so I cannot get the lastUsedTime from the Map.

Inspecting the SearcherLifetimeManager source code I see that the token
value is actually the IndexReader *version* and that is what I am using as
a key in the doPrune method. But I think this approach is risky, as these
are implementation details that if change will break my code. Actually,
there is a comment in that class that suggest a future change on that:

// TODO: we don't have to use IR.getVersion to track;

// could be risky (if it's buggy); we could get better

// bug isolation if we assign our own private ID

private static class PruneByLastUsedTime implements
SearcherLifetimeManager.Pruner {

        public boolean doPrune(double age, IndexSearcher searcher) {
            long readerVersion =
            long now = System.currentTimeMillis();
            if (lastUsedTime.containsKey(readerVersion)) {
                return (lastUsedTime.get(readerVersion) +
            return false;

Is this the right approach to implement a custom pruning strategy or am I
missing something?

Many thanks,

  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message