Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SOLR-大量开放搜索者_Solr_Lucene_Solr4 - Fatal编程技术网

SOLR-大量开放搜索者

SOLR-大量开放搜索者,solr,lucene,solr4,Solr,Lucene,Solr4,我的solr设置包括一个主机、一个中继器和两个从机。从属节点每10秒轮询各自的主节点。搜索仅由从属节点处理,而更新仅对主节点进行。它们部署在Linux机器上的Jboss应用服务器上。sorl版本是4.0 我们面临的问题是,从机机箱在几天内就会耗尽硬盘空间,我们目前正在通过每周重新启动一次从机节点来解决这个问题。硬盘空间不足的原因是Jboss持有数百个已删除索引文件的引用 删除的文件引用是活动的,因为我看到SolrCore有许多打开的搜索程序。根据solrconfig.xml,任何时候最多应有2个

我的solr设置包括一个主机、一个中继器和两个从机。从属节点每10秒轮询各自的主节点。搜索仅由从属节点处理,而更新仅对主节点进行。它们部署在Linux机器上的Jboss应用服务器上。sorl版本是4.0

我们面临的问题是,从机机箱在几天内就会耗尽硬盘空间,我们目前正在通过每周重新启动一次从机节点来解决这个问题。硬盘空间不足的原因是Jboss持有数百个已删除索引文件的引用

删除的文件引用是活动的,因为我看到SolrCore有许多打开的搜索程序。根据solrconfig.xml,任何时候最多应有2个打开的搜索器。

另一件事是,我能够确定SolrCore仅在查询已运行且复制周期在最后一个查询尚未完成时更改核心的已注册搜索程序时才持有打开的搜索程序。查询开始时,搜索者将永远保存在SolrCore的内存中

只有当查询使用我们编写的SearchPlugin时,这个问题才会出现。在搜索插件中,我们将关闭SolrRequestSolrCore对象。但它似乎仍然没有关闭相关的搜索引擎

SolrCore portfolioIndexCore = container.getCore(portfolioCoreName);
SolrIndexSearcher portfolioIndexSearcher = portfolioIndexCore.getSearcher().get();
搜索完成后:

finally {

      if (null != portfolioSolrReq) portfolioSolrReq.close();

      if (null != portfolioIndexCore) {
        portfolioIndexCore.close();
      }
    }
我尝试将上面的finally块更改为:

finally {

      if (null != portfolioSolrReq) portfolioSolrReq.close();

      if (null != portfolioIndexCore) {
        RefCounted<SolrIndexSearcher> searcher = portfolioIndexCore.getNewestSearcher(false);
        if (searcher.get() != portfolioIndexSearcher) {
          log.warn("Current Searcher for the Core " + portfolioIndexCore
              + " has changed. Old Searcher=[" + portfolioIndexSearcher + "], new Searcher=["
              + searcher.get() + "]");
          portfolioIndexSearcher.close();
          portfolioIndexSearcher = null;
        }
        searcher.decref();
        portfolioIndexCore.close();
      }
    }
最后{
if(null!=portfoliosolreq)portfoliosolreq.close();
if(null!=portfolioIndexCore){
RefCounted searcher=portfolioIndexCore.getNewestSearcher(false);
if(searcher.get()!=portfolioIndexSearcher){
log.warn(“当前核心搜索者”+portfolioIndexCore
+已更改。旧搜索程序=[“+portfolioIndexSearcher+”],新搜索程序=[”
+searcher.get()+“]”;
portfolioIndexSearcher.close();
portfolioIndexSearcher=null;
}
searcher.decref();
portfolioIndexCore.close();
}
}
但这似乎也没有帮助


上述问题的任何指针都将非常有用。

解决方案被证明相当简单。我所需要做的就是调用solrindexearcher上的decref(),我是通过调用
portfolioIndexCore.getSearcher().get()打开的

所以最后一个块现在看起来是:

finally {

      if (null != portfolioSolrReq) portfolioSolrReq.close();

      if (null != portfolioIndexCore) {
        RefCounted<SolrIndexSearcher> searcher = portfolioIndexCore.getNewestSearcher(false);
        if (searcher.get() != portfolioIndexSearcher) {
          log.warn("Current Searcher for the Core " + portfolioIndexCore
              + " has changed. Old Searcher=[" + portfolioIndexSearcher + "], new Searcher=["
              + searcher.get() + "]");
          portfolioIndexSearcher.close();
          portfolioIndexSearcher = null;
        }else{
          portfolioIndexSearcher.decref()
          }
        searcher.decref();
        portfolioIndexCore.close();
      }
    }
最后{
if(null!=portfoliosolreq)portfoliosolreq.close();
if(null!=portfolioIndexCore){
RefCounted searcher=portfolioIndexCore.getNewestSearcher(false);
if(searcher.get()!=portfolioIndexSearcher){
log.warn(“当前核心搜索者”+portfolioIndexCore
+已更改。旧搜索程序=[“+portfolioIndexSearcher+”],新搜索程序=[”
+searcher.get()+“]”;
portfolioIndexSearcher.close();
portfolioIndexSearcher=null;
}否则{
portfolioIndexSearcher.decref()
}
searcher.decref();
portfolioIndexCore.close();
}
}
现在SolrCore似乎并没有把旧的Solrindexearcher留在记忆中

教训: 如果通过调用
solrCore.getSearcher().get()
获取Solrindexearcher,则必须始终调用
solrindexearcher.decref()

但是,这应该是获取IndexSearcher引用的最后一个选项。更好的方法应该是
solrRequest.getSearcher().get()