Spring整合Solr7.1:总是需要开拓的勇气

原创 2017年11月17日 19:24:44

自我更新,需要对技术的热爱,对极致的追求

一.环境说明

  • Windows 10 ver 1709
  • IDEA 2017.2.6
  • Spring 4.3.12
  • Solr 7.1.0

二.开始吧

最近在做solr的升级工作,从4.10升级到最新的7.1,却发现困难难重重.因为相关可参考的资料太少了,能搜到的基本都是停留在solr4或5之类的,而再往上的却只有寥寥,让我这个菜鸟很是忧伤.没办法,只能一步步查源码,翻官方文档,来研究更新了什么.

三.对比

在4.10.3的时候,配置是这样的,新建个applicationSolr.xml,作为solr的配置文件(个人喜好,也可以不单独出来)

首先一个改变就是,在4.10的时候,要配置的是HttpSolrServer,而在7.1的时候,你需要配置的东西改名成HttpSolrClient了

这是solr4.10.3的HttpSolrServer的构造方法

 public HttpSolrServer(String baseURL) {
        this(baseURL, (HttpClient)null, new BinaryResponseParser());
    }

    public HttpSolrServer(String baseURL, HttpClient client) {
        this(baseURL, client, new BinaryResponseParser());
    }

    public HttpSolrServer(String baseURL, HttpClient client, ResponseParser parser) {
        this.requestWriter = new RequestWriter();
        this.followRedirects = false;
        this.maxRetries = 0;
        this.queryParams = Collections.emptySet();
        this.baseUrl = baseURL;
        if (this.baseUrl.endsWith("/")) {
            this.baseUrl = this.baseUrl.substring(0, this.baseUrl.length() - 1);
        }

        if (this.baseUrl.indexOf(63) >= 0) {
            throw new RuntimeException("Invalid base url for solrj.  The base URL must not contain parameters: " + this.baseUrl);
        } else {
            if (client != null) {
                this.httpClient = client;
                this.internalClient = false;
            } else {
                this.internalClient = true;
                ModifiableSolrParams params = new ModifiableSolrParams();
                params.set("maxConnections", 128);
                params.set("maxConnectionsPerHost", 32);
                params.set("followRedirects", this.followRedirects);
                this.httpClient = HttpClientUtil.createClient(params);
            }

            this.parser = parser;
        }
    }

这是solr4.10.3的applicationContextSolr.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="httpSolrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
        <constructor-arg value="solrCore的远程地址"/>
    </bean>

</beans>

这里是solr7.1的HttpSolrClient构造方法

**
   * @deprecated use {@link HttpSolrClient#HttpSolrClient(Builder)} instead, as it is a more extension/subclassing-friendly alternative
   */
  @Deprecated
  protected HttpSolrClient(String baseURL, HttpClient client, ResponseParser parser, boolean allowCompression) {
    this(new Builder(baseURL)
        .withHttpClient(client)
        .withResponseParser(parser)
        .allowCompression(allowCompression));
  }

  /**
   * The constructor.
   *
   * @param baseURL The base url to communicate with the Solr server
   * @param client Http client instance to use for communication
   * @param parser Response parser instance to use to decode response from Solr server
   * @param allowCompression Should compression be allowed ?
   * @param invariantParams The parameters which should be included with every request.
   * 
   * @deprecated use {@link HttpSolrClient#HttpSolrClient(Builder)} instead, as it is a more extension/subclassing-friendly alternative
   */
  @Deprecated
  protected HttpSolrClient(String baseURL, HttpClient client, ResponseParser parser, boolean allowCompression,
      ModifiableSolrParams invariantParams) {
    this(new Builder(baseURL)
        .withHttpClient(client)
        .withResponseParser(parser)
        .allowCompression(allowCompression)
        .withInvariantParams(invariantParams));
  }

  protected HttpSolrClient(Builder builder) {
    this.baseUrl = builder.baseSolrUrl;
    if (baseUrl.endsWith("/")) {
      baseUrl = baseUrl.substring(0, baseUrl.length() - 1);
    }
    if (baseUrl.indexOf('?') >= 0) {
      throw new RuntimeException(
          "Invalid base url for solrj.  The base URL must not contain parameters: "
              + baseUrl);
    }

    if (builder.httpClient != null) {
      this.httpClient = builder.httpClient;
      this.internalClient = false;
    } else {
      this.internalClient = true;
      ModifiableSolrParams params = new ModifiableSolrParams();
      params.set(HttpClientUtil.PROP_FOLLOW_REDIRECTS, followRedirects);
      params.set(HttpClientUtil.PROP_ALLOW_COMPRESSION, builder.compression);
      httpClient = HttpClientUtil.createClient(params);
    }

    this.parser = builder.responseParser;
    this.invariantParams = builder.invariantParams;
    this.connectionTimeout = builder.connectionTimeoutMillis;
    this.soTimeout = builder.socketTimeoutMillis;
  }

可以看出,在solr最新版的源码中,已经移除了只有baseUrl的构造方法,但是加入了一个接收一个叫Builder的参数的构造方法,那么,Builder是什么?
ctrl+鼠标左键,看到了下面这段代码:

//无参构造
 public Builder() {
      this.responseParser = new BinaryResponseParser();
    }
  /**
     * Create a Builder object, based on the provided Solr URL.
     * 
     * Two different paths can be specified as a part of this URL:
     * 
     * 1) A path pointing directly at a particular core
     * <pre>
     *   SolrClient client = new HttpSolrClient.Builder("http://my-solr-server:8983/solr/core1").build();
     *   QueryResponse resp = client.query(new SolrQuery("*:*"));
     * </pre>
     * Note that when a core is provided in the base URL, queries and other requests can be made without mentioning the
     * core explicitly.  However, the client can only send requests to that core.
     * 
     * 2) The path of the root Solr path ("/solr")
     * <pre>
     *   SolrClient client = new HttpSolrClient.Builder("http://my-solr-server:8983/solr").build();
     *   QueryResponse resp = client.query("core1", new SolrQuery("*:*"));
     * </pre>
     * In this case the client is more flexible and can be used to send requests to any cores.  This flexibility though
     * requires that the core be specified on all requests.
     * 
     * By default, compression is not enabled on created HttpSolrClient objects.
     */
    public Builder(String baseSolrUrl) {
      this.baseSolrUrl = baseSolrUrl;
      this.responseParser = new BinaryResponseParser();
    }

哈哈,可以看到,原来你需要用baseUrl先构造出来一个Builder对象,然后再用Builder去构造出我们需要的HttpSolrClient对象.
虽然,源码还没研究明白,但总算是解决了问题.
下面就是我们Spring整合Solr7所需的配置文件了

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">

<!--版本更新说明:
    1.从solr5.x开始,HttoSolrServer就变成了HttpSolrClient
    2.查看源码发现,之前的构造方法已经修改,以前的注入方法也不再适用.主要由一个静态类builder来构造,而builder需要一个baseUrl,
      所以差不多就是之前的单baseUrl的构造方法(源码179,830)
 -->
<bean id="httpSolrClient" class="org.apache.solr.client.solrj.impl.HttpSolrClient">
    <constructor-arg name="builder" value="solrCore的远程地址"/>
</bean>

</beans>

2017/11/17
Lucifer

版权声明:本文为博主原创文章,未经博主允许不得转载。

雷观(二十一):想创业,需要刺激;去创业,需要勇气;创业成功,需要智慧

创业,是改革开放之后,尤其是最近十多年的热词。   无数当今的年轻人和曾经的年轻人,都走向了自主创业的道路。成功的很多,失败的更多。   不过,我觉得,创业成功的人数是越来越多了。    为什么这么说...
  • FansUnion
  • FansUnion
  • 2015年02月04日 20:26
  • 2743

Spring与MyBatis整合需要哪些包

Spring与MyBatis整合需要哪些包 使用maven管理将之前的java项目使用了maven管理,就不用导入那么多jar包了(网上很多还是导多了包,强迫症不舒服),maven会帮我们解决依赖问题...
  • Autumn_bell
  • Autumn_bell
  • 2016年07月28日 17:47
  • 9568

使用Spring整合Hibernate的小例子,内含所有jar包导入Eclipse即可运行

代码下载链接:  http://download.csdn.net/detail/u013803262/8532881 ssh框架是当前流行的主流框架,广泛的运用与JavaEE企业级应用...
  • u013803262
  • u013803262
  • 2015年03月25日 16:26
  • 1914

solr+spring+hibernate+maven+webservice整合框架

  • 2017年12月28日 15:01
  • 55.86MB
  • 下载

CentOS 7安装部署Solr 7.1:记一次踩坑填坑经历

一.环境说明 CentOS 7.4 Solr 7.1 Tomcat 9.0.1 JDK1.8.0_152 阿里云ESC 二.前期准备1.由于本人计算机性能捉急,所以购买了一个阿里云服务器.与虚拟机效果...
  • cslucifer
  • cslucifer
  • 2017年11月16日 15:37
  • 221

solr.in.action-ch07(7.1-7.3)

7.1.1请求处理器 请求处理器是所有到solr请求的入口,它们的工作就是接收一个请求,进行一些函数,然后返回一个响应到客户端.solr包含大量的请求处理器来涵盖一切.运行一个搜索(搜索处理器),从一...
  • xiejx618
  • xiejx618
  • 2015年11月15日 20:37
  • 767

[Scrum 随想录] [理念]我们需要的只是一点改变的勇气

公司推行敏捷Scrum差不多半年,Scrum从提出,试运行,到现在,期间我相信每个人在面对新事物的时候都有疑惑和想法,我也一样。每个人都有解释外部世界的方法,达成共识从来都是一件难事,我打算写这个Sc...
  • robbiczzz
  • robbiczzz
  • 2011年01月22日 09:25
  • 211

改变拖延症?你只需要20秒疯狂的勇气

改变拖延症?你只需要20秒疯狂的勇气 LinkedIn中国 现在很多人给自己贴“拖延症”的诊断标签,说自己“不上进”。恰恰相反,真正不上进的人,...
  • Jacketinsysu
  • Jacketinsysu
  • 2015年03月20日 21:21
  • 804

唉,人生需要勇气,但也需要理智

在不断的生活中,不断的发现新的东西,看到新的事物,而在大学中,我的舍友他独自去创业了,感觉他很有勇气,但是有时候又感觉他有点不理智,因为他只为了赚钱,啥都肯干,但是感觉他这样埋头苦干有没有什么意义,每...
  • dapeng0112
  • dapeng0112
  • 2014年08月16日 22:36
  • 454

创新易死需要勇气 需要抵御“抄袭”心魔

创新易死需要勇气  需要抵御“抄袭”心魔 文/王易见     最近在上演《霍比特人》抄袭,联想到此前的《魔戒三部曲》。魔戒俘获了无数的信徒,你需要强大的意志和内心才能抵挡它的诱惑。    ...
  • feitianhanxue
  • feitianhanxue
  • 2013年03月01日 17:26
  • 963
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring整合Solr7.1:总是需要开拓的勇气
举报原因:
原因补充:

(最多只允许输入30个字)