设为首页 收藏本站
查看: 698|回复: 0

[经验分享] Solr分析

[复制链接]

尚未签到

发表于 2016-12-14 08:55:04 | 显示全部楼层 |阅读模式
  最近一直在研究Solr的相关源代码,今天开始记录!
           1.SolrCore启动
                首先我们看solrcore的核心构造方法,如下:

public SolrCore(String name, String dataDir, SolrConfig config, IndexSchema schema, CoreDescriptor cd, UpdateHandler updateHandler, IndexDeletionPolicyWrapper delPolicy, SolrCore prev)
    整个solrcore的初始化有这个构造方法完成,主要做了如下几件事情:
     1):initDirectoryFactory()通过solrconfig.xml文件中<directoryFactory/>配置初始化directory工厂,如果没有配置默认则采用NRTCachingDirectoryFactory
       2)获取solr索引根目录,配置在solrConfig.xml文件中
       3) initListeners();初始化后监听器newSearcher。firstSearcher
       4)initIndex():初始化Directory(NRTCachingDirectory)和indexfactory,其中对directory进行缓存
  5)initWriters(),initQParsers();initValueSourceParsers(); initTransformerFactories();后续介绍
  6)通过solrConfig文件初始化相关RequestHandler
  7)getSearcher(false, false, null, true)初始化searcher(下面重点分析这个方法)
  在solrcore的构造方法中有如下一段代码

// cause the executor to stall so firstSearcher events won't fire
// until after inform() has been called for all components.
// searchExecutor must be single-threaded for this to work
searcherExecutor.submit(new Callable<Void>() {
public Void call() throws Exception {
latch.await();
return null;
}
});
  这个有一段注解,大概意识是说:阻塞线程池,直到所有的组件都初始化完成前不执行firstSearcher这个事件,为什么要这样做了,和我们接下来要分析的getSearcher(false, false, null, true)这个方法有莫大的关系。
  方法定义如下:

public RefCounted<SolrIndexSearcher> getSearcher(boolean forceNew, boolean returnSearcher, final Future[] waitSearcher, boolean updateHandlerReopens)
forceNew:true表示强制创建searcher
returnSearcher:true表示返回创建的searcher本质就是searcher引用加1
    我们具体代码来分析,首先

  if (_searcher!=null && !forceNew) {
if (returnSearcher) {
_searcher.incref();
return _searcher;
} else {
return null;
}
}
   在solrcore初始化的时候_searcher=null,根据上面提到的参数做相关的处理;



  
if (onDeckSearchers>0 && !forceNew && _searcher==null) {
try {
searcherLock.wait();
} catch (InterruptedException e) {
log.info(SolrException.toStr(e));
}
}
// check again: see if we can return right now
if (_searcher!=null && !forceNew) {
if (returnSearcher) {
_searcher.incref();
return _searcher;
} else {
return null;
}
}
  两次检查,如果发现其他线程在构建search当前线程等待,等待其他线程构建完成直接返回!
searchHolder = openNewSearcher(updateHandlerReopens, false)
  创建一个新的searcher,具体过程就根据SolrIndexSearcher构造函数创建一个searcher 然后包装返回。由于初始化solrcore不存在solr相关的缓存的,所以不存在相关缓存的预热过程,在这个就跳过。后续详细分析。
      if (currSearcher==null && firstSearcherListeners.size() > 0) {
future = searcherExecutor.submit(
new Callable() {
public Object call() throws Exception {
try {
for (SolrEventListener listener : firstSearcherListeners) {
listener.newSearcher(newSearcher,null);
}
} catch (Throwable e) {
SolrException.log(log,null,e);
}
return null;
}
}
);
}
if (currSearcher!=null && newSearcherListeners.size() > 0) {
future = searcherExecutor.submit(
new Callable() {
public Object call() throws Exception {
try {
for (SolrEventListener listener : newSearcherListeners) {
listener.newSearcher(newSearcher, currSearcher);
}
} catch (Throwable e) {
SolrException.log(log,null,e);
}
return null;
}
}
);
}
  solr相关的事件处理。这个就和上面提到的solrcore构造函数中线程池阻塞有关系.solr构建searcher包含两个事件,在solrconfig文件中可以进行配置,如下

   <listener event="newSearcher" class="solr.QuerySenderListener"/>

   <listener event="firstSearcher" class="solr.QuerySenderListener">

    newSearcher:每次创建新的searcher的时候都执行一次

    firstSearcher:solrcore初始化的时候,只执行一次

  我们可以通过上面的两个事件做一些数据的初始化,进行相关数据的查询预热。

  以上分析比较粗糙,省略了相关细节在后续会慢慢补上,敬请关注!

 

 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-314014-1-1.html 上篇帖子: solr csv 导入 下篇帖子: solr cache
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表