Solr6 源码结构分析
摘要: Apache Solr的源码不是很复杂,从源码的结构角度看,更容易理解Solr的设计思想。
Solr包结构
Solr6的包结构如下:
org.apache.solr.analysis
org.apache.solr.client.solrj.embedded
org.apache.solr.cloud
org.apache.solr.cloud.overseer
org.apache.solr.core
org.apache.solr.handler
org.apache.solr.handler.admin
org.apache.solr.handler.component
org.apache.solr.handler.loader
org.apache.solr.highlight
org.apache.solr.index
org.apache.solr.index.hdfs
org.apache.solr.internal.csv
org.apache.solr.internal.csv.writer
org.apache.solr.logging
org.apache.solr.logging.jul
org.apache.solr.logging.log4j
org.apache.solr.parser
org.apache.solr.query
org.apache.solr.request
org.apache.solr.request.json
org.apache.solr.request.macro
org.apache.solr.response
org.apache.solr.response.transform
org.apache.solr.rest
org.apache.solr.rest.schema
org.apache.solr.rest.schema.analysis
org.apache.solr.schema
org.apache.solr.search
org.apache.solr.search.facet
org.apache.solr.search.function
org.apache.solr.search.function.distance
org.apache.solr.search.grouping
org.apache.solr.search.join
org.apache.solr.search.mlt
org.apache.solr.search.similarities
org.apache.solr.search.stats
org.apache.solr.security
org.apache.solr.servlet
org.apache.solr.servlet.cache
org.apache.solr.spelling
org.apache.solr.spelling.suggest
org.apache.solr.store.blockcache
org.apache.solr.store.hdfs
org.apache.solr.update
org.apache.solr.update.processor
org.apache.solr.util
org.apache.solr.util.hll
org.apache.solr.util.plugin
org.apache.solr.util.stats
org.apache.solr.util.xlst
Solr6大约有50多个多包。
结构分析
从使用者的角度来看,最先看到的应当是servlet。由于Solr本身是一个独立的网络应用程序,需要在Servlet容器中运行来提供服务,因此servlet是用户接触的最外层。
对于一般的servlet来说,都是继承自 HttpServlet类,默认有4个方法:
init()
destory()
doGet()
doPost()
分析SolrServlet 类。首先 servlet 会调用 init()方法进行初始化:通过 Context 查找 java:comp/env/solr/home 来确定Solr 的主目录(home),接着调用 Config.setInstanceDir(home)方法设置这个实例的目录。然后通过SolrCore.getSolrCore()来获得一个SolrCore实例。destroy()方法将会在 Servlet 对象销毁时调用,仅仅调用 core.close()关闭 SolrCore 实例。
当用户请求进来时 doPost()简单地将任务交给 doGet()完成,主要的任务由 doGet()完成。分析一下 doGet()方法:
1) 使用 SolrCore 和 doGet()参数 request 生成一个 SolrServletRequest 对象(注意:这个 SolrServletRequest 类
不是公开类,位于 org.apache.solr.servlet 包中,继承了 SolrQueryRequestBase 类,仅仅接受 SolrCore 和
HttpServletRequest 对象作为参数。
2) 然后 SolrCore 执行 execute()方法(参数为 SolrServletRequest 和 SolrQueryResponse)。由此可见,真正的处理核心是 SolrCore 的 execute 方法。
还没有评论,来说两句吧...