Solr 二--core 核心源码解读和如何写solr plugin
2014-12-12 17:23
435 查看
从web.xml 开始找到web 入口
<?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" metadata-complete="true" version="2.5"> <filter> <filter-name>SolrRequestFilter</filter-name> <filter-class>org.apache.solr.servlet.SolrDispatchFilter</filter-class> </filter> <filter-mapping> <filter-name>SolrRequestFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>Zookeeper</servlet-name> <servlet-class>org.apache.solr.servlet.ZookeeperInfoServlet</servlet-class> </servlet> <servlet> <servlet-name>LoadAdminUI</servlet-name> <servlet-class>org.apache.solr.servlet.LoadAdminUiServlet</servlet-class> </servlet> <servlet> <servlet-name>RedirectOldAdminUI</servlet-name> <servlet-class>org.apache.solr.servlet.RedirectServlet</servlet-class> <init-param> <param-name>destination</param-name> <param-value>${context}/#/</param-value> </init-param> </servlet> <servlet> <servlet-name>RedirectOldZookeeper</servlet-name> <servlet-class>org.apache.solr.servlet.RedirectServlet</servlet-class> <init-param> <param-name>destination</param-name> <param-value>${context}/zookeeper</param-value> </init-param> </servlet> <servlet> <servlet-name>RedirectLogging</servlet-name> <servlet-class>org.apache.solr.servlet.RedirectServlet</servlet-class> <init-param> <param-name>destination</param-name> <param-value>${context}/#/~logging</param-value> </init-param> </servlet> <servlet> <servlet-name>SolrRestApi</servlet-name> <servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class> <init-param> <param-name>org.restlet.application</param-name> <param-value>org.apache.solr.rest.SolrRestApi</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>RedirectOldAdminUI</servlet-name> <url-pattern>/admin/</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>RedirectOldAdminUI</servlet-name> <url-pattern>/admin</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>RedirectOldZookeeper</servlet-name> <url-pattern>/zookeeper.jsp</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>RedirectLogging</servlet-name> <url-pattern>/logging</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Zookeeper</servlet-name> <url-pattern>/zookeeper</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>LoadAdminUI</servlet-name> <url-pattern>/admin.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>SolrRestApi</servlet-name> <url-pattern>/schema/*</url-pattern> </servlet-mapping> <mime-mapping> <extension>.xsl</extension> <mime-type>application/xslt+xml</mime-type> </mime-mapping> <welcome-file-list> <welcome-file>admin.html</welcome-file> </welcome-file-list> </web-app><span id="_xhe_cursor"> </span>
web.xml定义了web的入口和url mapping
从web.xml里面可以看到所有的url都会首先经过filter:org.apache.solr.servlet.SolrDispatchFilter
SolrDispatchFilter
1.init(FilterConfig config)做了哪些准备工作
1)从FilterConfig (web.xml)中获取当前pathPrefix,定位solrHome目录
2)加载lib下面的class和依赖的luceneSPI3)定位solrHome下面的solr.xml,并读取solr.xml相关信息存入ConfigSolr,最重要的是获取zkHost信息
4)接下来load 每个core的信息通过CoreConatiner 类的load方法,其主要包括:
Note:ConfigSolr 在代码中指定了core admin Handler:
org.apache.solr.handler.admin.CoreAdminHandler,该类对应 admin UI的core admin 部分的处理
初始化zookeeper相关的东西,并从zookeeper中获取所有的获取所有solr node的CoreDescription信息(see ZKController)
得到所有cores的信息后,并行load所有的core(通过一个fixed threadPool 实现的)。
这样SolrCores 在CoreContainer中已经初始化,并且通过SolrDispatchFilter中一个volatile的CoreContainer 变量共享
2. DoFilter 接收allServletRequest并分发所有的request到具体的Handler处理
1)讲CoreContainer放入request的attribute中 share2)解析parth url,并分给相应的Handler处理
3)如果是进入指定的core的话,每个core下层的request则通过SolrCores里面的
RequestHandlers 找到对于的RequestHander处理。
4)SolrQueryParsers 负责将HttpServeletRequest 转化成SolrQueryRequest。
SolrRequestHandler
1.init
其中参数应该是lst部分<requestHandler name="/query" class="solr.SearchHandler"> <lst name="defaults"> <str name="echoParams">explicit</str> <str name="wt">json</str> <str name="indent">true</str> <str name="df">text</str> </lst> </requestHandler>
如果你有一些属性依赖NamedList 或Pluginfo,且必须在servlet接收request前初始化,则可以override父类RequestHandlerBase的init接口
2. HandleRequest
SolrCoreAware
如果你有一些属性依赖SolrCore,且必须在servlet接收request前初始化,可以实现该接口的inform方法,将solrcore注入,类似Spring里面的XXXAware。SearchHandler
1.只有一个searchHandler,searchhandler里面hold了一个List<SearchComponent>2.可以通过注入一个新的searchComponent来custom searchHandler。
3.searchComponent可在solrconfig.xml里面查询。
4.http://wiki.apache.org/solr/SearchComponent
Search components enable a
SearchHandler to chain together reusable pieces of functionality to create custom search handlers without writing code.
There are currently several "default"
SearchComponents which now comprise the default SearchHandler. They are:
query -
QueryComponent
facet -
FacetComponent
mlt -
MoreLikeThis
highlight -
Highlighting
stats -
Statistics
Solr1.4
debug -
Debug
SearchComponent
QueryComponent
相关文章推荐
- cppunit源码解读 2核心部分(Core)——2.1基本测试类
- cppunit源码解读 2核心部分(Core)——2.2 测试结果记录
- 解读和分析Linux核心源码的两种方法
- 解读和分析Linux核心源码的两种方法
- mvc源码解读(1)-如何找到mvcHandler
- 源代码阅读方法 jQuery源码解析 核心模块core.js
- jQuery 1.8源码分析 core.js核心模块 jQuery对象的构造分析
- 菜鸟解读qt源码----qsqldriverplugin.h
- 如何判断一个Http Message的结束——python源码解读
- Three.js源码阅读笔记(基础的核心Core对象)
- Java HashMap 核心源码解读
- NDK如何调试系统核心动态库(无系统源码的情况)
- 解读和分析Linux核心源码的两种方法
- Java HashMap 核心源码解读<摘录>
- Tomcat源码解读系列(二)——Tomcat的核心组成和启动过程
- Three.js源码阅读笔记(基础的核心Core对象)
- 解读和分析Linux核心源码的两种方法
- Java HashMap 核心源码解读
- 源码__Discuz! X2 核心类源码(class_core.php)分析
- stagefright 架构分析(八) 如何获取ComponentHandle,plugin与omx_core桥接