Hi,
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 {
this.slm.release(searcher);
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 {
@Override
public boolean doPrune(double age, IndexSearcher searcher) {
long readerVersion =
((DirectoryReader)searcher.getIndexReader()).getVersion();
long now = System.currentTimeMillis();
if (lastUsedTime.containsKey(readerVersion)) {
return (lastUsedTime.get(readerVersion) +
EXPIRATION_TIMEOUT_MS) < now;
}
return false;
}
Is this the right approach to implement a custom pruning strategy or am I
missing something?
Many thanks,
Iván.