java - lucene,如何一起使用 SearcherManager 和 SearcherLifetimeManager

标签 java solr elasticsearch lucene

在 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/

相关文章:

java - 首次运行 Android 应用程序成功尝试后如何跳过 LoginActivity

ElasticSearch 仅获取文档 ID,_id 字段,使用索引上的搜索查询

elasticsearch - 使用elasticquent lib创建Elasticsearch映射时出错

java - 使用 Java 在 XMPP 服务器中创建新用户

java - 在 Hibernate 表中保存 POJO 时发生 hibernate.MappingException

java - 如何为许多写入者和许多读者(线程)添加和删除 HashMap?

elasticsearch - 具有多个精确值的Elasticsearch查询

solr - 是否可以使用 solrconfig.xml 过滤 Solr 结果?

solr - 索引具有 mm 关系的表

java - SolrTemplate 和 SolrClient 有什么区别?