Solr 二--core 核心源码解读和如何写solr plugin

本文深入解析了web.xml文件中定义的Solr web入口和URL映射,详细介绍了SolrDispatchFilter的作用及其初始化过程,包括路径前缀获取、依赖加载、配置文件读取和ZooKeeper初始化等关键步骤。同时,阐述了如何通过过滤器和请求映射分发请求到特定的Handler进行处理,以及请求如何被共享给核心容器,进而通过核心容器内的请求处理器进行进一步的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 从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:

SearchComponent

QueryComponent





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值