solr创建SolrIndexSearcher

SolrIndexSearcher创建代码在SolrCore.class中

 tmp = new SolrIndexSearcher(this, newIndexDir, getLatestSchema(), getSolrConfig().indexConfig, 
              (realtime ? "realtime":"main"), newReader, true, !realtime, true, directoryFactory);

需要注意的是:是不是realtime search,一旦realtime search,没有缓存,性能有影响。

一个core持有一个SolrIndexSearcher,属于重量级对象,持有各种Cache,每次query,获取的是SolrIndexSearcher对象的一次引用,SolrCore中维护了它创建SolrIndexSearcher的引用计数器链:

  private final LinkedList<RefCounted<SolrIndexSearcher>> _searchers = new LinkedList<RefCounted<SolrIndexSearcher>>();
  private final LinkedList<RefCounted<SolrIndexSearcher>> _realtimeSearchers = new LinkedList<RefCounted<SolrIndexSearcher>>();

同时为了维护这么个引用计数,又有了各种监听器,

  final List<SolrEventListener> firstSearcherListeners = new ArrayList<SolrEventListener>();
  final List<SolrEventListener> newSearcherListeners = new ArrayList<SolrEventListener>();

实际上线上成千上万的请求都是一个SolrIndexSearcher,成千上万个引用。

我们有时候会在core中手动创建searcher=core.getSearcher();这中做法要小心,需要做searcher.decref();操作,最好是用SolrQueryRequest.getSearcher();这样系统会帮忙对引用--。

还有一个要注意的是,core重启的时候,searcher会重新创建,不过旧的core和旧的searcher会继续存在一段时间,处理未完成的请求,直到引用计数为0。

SolrCore中有一个maxWarmingSearchers参数,控制最多存在的searcher个数:

 this.maxWarmingSearchers = 2;  // we don't have a config yet, just pick a number.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值