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

[经验分享] Solr 获取searcher实例分析

[复制链接]

尚未签到

发表于 2015-7-18 12:09:58 | 显示全部楼层 |阅读模式
  每一个搜索请求都会持有一个searcher的引用,而不是创建一个新的searcher,处理完后会释放掉这个引用
Solr在初始化化时,通过SolrCore核心类要做很多的初始化工作,包过读取solrconfig.xml配置文件里的内容,代码如下:



1 booleanQueryMaxClauseCount();
2 //设置布尔查询最多个数。
3 initListeners();
4 //读取配置文件的search实例的监听器。
5
6 initDeletionPolicy();
7 initIndex();
8
9 initWriters();
10 initQParsers();
11
12 initValueSourceParsers();
13 this.searchComponents = loadSearchComponents();
15 // Processors initialized before
16 the handlers
17 updateProcessorChains = loadUpdateProcessorChains();
19 reqHandlers = new
20 RequestHandlers(this);
21 reqHandlers.initHandlersFromConfig(solrConfig);
23 highlighter = initHighLighter();
25 // Handle things that should eventually
26 go away
28 initDeprecatedSupport();
  loadSearchComponents方法就是初始化indexSearch实例。详细说明如下:
getSearcher
– (forceNew, returnSearcher, waitSearcher-Futures)
关注solr全局三个点调用getSearcher函数
: solrCore初始化时(false, false, null),QueryComponent处理查询
请求时(false, true,
null),UpdateHandler在处理commit请求时(true, false, new
Future[1])
---------
1.solrCore初始化时
根据solrconfig配置的IndexReaderFactory&DirectoryFactory获取索引的IndexReader,再使用这个reader封装一个SolrIndexReader,再使用这个SolrIndexReader封装一个RefCounted(searcher的引用计数器,当搜索组件获取一个组件后引用++,用完后调用close引用--,当引用数为0时将这个引用从core管理的一个当前被使用的searcher的链表移除,同时调用searcher.close回收资源),将这个引用添加到core管理的一个当前被使用的searcher的链表里如果firstSearcherListeners不为空则回调这些监听器,这个回调是交给core的一个newSingleThreadExecutor去做的,再往这个线程池里添加一个任务:将这个RefCounted设置为core当前最新的searcher的引用计数器最后返回null,因为returnSearcher=false在solrCore初始化时这样做的主要目的是在初始化时就加载好IndexSearcher,搜索请求来了之后能立即返回,而不必等待加载IndexSearcher
---------
2.QueryComponent处理查询请求时
由于core当前最新的searcher的引用计数器不为null且这个获取IndexSearcher的请求不是强制要求获取最新的,且returnSearcher=true故直接返回core当前最新的searcher的引用计数器,且这个引用计数器做++这里面还有段当前searcher的引用计数器为null的逻辑,但是没有发现有什么情况会导致这种情况发生故不累述了
  ---------
3.UpdateHandler在处理commit请求时
首先到core管理的一个当前被使用的searcher的链表里获取目前最新的searcher;同时会加载索引目录下的index.properties文件(如果存在的话),拿到KEY=’index’的值,其指明目前索引的存放地方;如果获取的目录和当前最新的searcher使用的目录一致且solrConfig.reopenReaders为true则获取通过searher.reader.reopen获取最新的reader -> 封装成searcher,否则直接IndexReader.open获取reader。获取到searcher后的一段逻辑[RefCount封装,添加到searchers链表]和core初始化时是一样的,接下来的逻辑是如果solrConfig.useColdSearcher为TRUE其当前searcher的引用为null-导致来自QueryComponent的请求阻塞[现在还没发现什么情况会导致searcher的引用为null]立即将这个新的searcher的引用设置为core当前最新的searcher的引用计数器,这样来自QueryComponent的请求拿到这个引用后返回,当时这时这个新建的searcher是没有经过其前一个searcher的cache热身的,同时这样会导致这个新建的searcher不会进行热身活动如果solrConfig.useColdSearcher为FALSE则会往线程池里添加一个热身的任务如果newSearcherListeners不为空则回调这些监听器,也是给线程池的任务最后如果先前没有做将新的searcher的引用设置为core当前最新的searcher的引用计数器的行为的话,则往线程池添加一个任务 – 将新的searcher的引用设置为core当前最新的searcher的引用计数器最后返回null,因为returnSearcher=false

运维网声明 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-87973-1-1.html 上篇帖子: solr 索引更新 下篇帖子: Solr安装(Tomcat)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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