您的位置:首页 > 其它

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和依赖的luceneSPI

3)定位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中 share

2)解析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




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: