在 lucene 文档 SearcherManager 中
IndexSearcher s = manager.acquire();
try {
// Do searching, doc retrieval, etc. with s
} finally {
manager.release(s);
}
// Do not use s after this!
s = null;
因此,搜索后应该释放该对象,不再使用它。 但是SearcherLifetimeManager需要在内部Map中存储indexsearcher,然后获取:
long token = mgr.record(searcher);
IndexSearcher searcher = mgr.acquire(token);
mgr.release(searcher);
如何同时使用这两种方法而不中断 订购 API 调用?
最佳答案
基本上,您需要来自用户的 token 并检查此 token 是否对 LifetimeManager 仍然有效,否则您使用来自 SearcherManager 的新 IndexSearcher 创建一个新 token 。它可能看起来像这样:
// Boxed Long, can be null to mean that you might not have a token.
// You could also use Optional or something similar.
Long tokenFromRequest;
// Might be the same as the incoming token or a new one.
Long tokenToReturn;
IndexSearcher is;
if (tokenFromRequest == null) { // no previous token, need a new one
is = manager.acquire(); // get searcher from SearcherManager
tokenToReturn = mgr.record(is); // get a fresh token for this searcher
} else {
is = mgr.acquire(tokenFromRequest); // try to get the recorded searcher
if (is != null) { // token is valid
tokenToReturn = tokenFromRequest;
} else {
is = manager.acquire(); // get searcher from SearcherManager
tokenToReturn = mgr.record(is); // get a token for this searcher
}
}
try {
// Do searching, doc retrieval, etc. with is
} finally {
if (tokenToReturn == tokenFromRequest) {
// token was valid, we need to release the searcher
// to the LifetimeManager, the SearcherManager had
// nothing to do with this IndexSearcher
mgr.release(is);
} else {
// we got this searcher from SearcherManager,
// the LifetimeManager records its usage as well and
// we need to release it to show that _we_ are finished
// using it, otherwise it would be kept open forever
manager.release(is);
}
}
// Do not use is after this!
is = null;
//return tokenToReturn to user to be sent with the next request
关于java - lucene,如何一起使用 SearcherManager 和 SearcherLifetimeManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32337372/