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.