温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Spring-Boot集成Solr客户端的示例分析

发布时间:2021-07-08 13:52:03 来源:亿速云 阅读:150 作者:小新 栏目:编程语言

这篇文章主要为大家展示了“Spring-Boot集成Solr客户端的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring-Boot集成Solr客户端的示例分析”这篇文章吧。

Solr 是基于 Lucene 的全文检索服务器,可配置、可扩展,并对索引和搜索性能进行了优化。Solr 多用于电子商务网站、门户、论坛这类网站的站内搜索。Solr 可以独立运行在 Jetty、Tomcat 等这些 Servlet 容器中。Solr 索引的实现非常简单,用 POST 方法去向 Solr服务器发送一个描述 Field 及其内容的 JSON 文档,Solr 根据 JSON 文件增删改索引。Solr 搜索只需要发送 HTTP GET 请求,然后对 Solr 返回 JSON 格式的查询结果进行解析,组织页面布局。Solr 不提供构建 UI 的功能,Solr提供了一个管理界面,通过管理界面可以查询 Solr 的配置和运行情况。

tips: IDEA的快速查找类快捷键 (连续按两次 shift 键)

1) maven配置:

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.2.RELEASE</version>
  </parent>

  <properties>
    <spring.data.solr.version>2.1.1.RELEASE</spring.data.solr.version>
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-solr</artifactId>
        <version>${spring.data.solr.version}</version>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <!--添加Web依赖, 使项目变成web项目-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-solr</artifactId>
    </dependency>

    <!--test-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
  </dependencies>

2) SpringBoot 快速启动

@SpringBootApplication
@EnableAutoConfiguration
public class AppMain {

  public static void main(String[] args) {
    SpringApplication.run(AppMain.class, args);
  }
}

可能遇见的问题:

1. 一般spring-boot项目的启动类都放在项目的根路径下, 这样可以不用配置@ComponentScan注解来扫描相应的类, 如果遇到无法读取配置类属性的情况, 首先考虑这个因素

3) 在resources下新建application.properties, 完成solr的基本配置

spring.data.solr.host=http://127.0.0.1:8983/solr

这个属性配置的是solr服务器的访问地址, 因为本项目是作为客户端来访问solr服务器, 所以不用做更多的配置

这个属性是是通过@ConfigurationProperties("spring.data.solr")读取出来的, 默认被读取到 SolrProperties.class 中 详情请使用类查找器查看该类

4) 新建一个Controller用来查询Solr服务器数据

@RestController
public class SolrController {

  @Autowired
  private SolrClient client;

  @RequestMapping("/")
  public String testSolr() throws IOException, SolrServerException {
    SolrDocument document = client.getById("test", "fe7a5124-d75b-40b2-93fe-5555512ea6d2");
    System.out.println(document);
    return document.toString();
  }
}

数据是我提前导入的, 这里使用ID查询结果
SolrDocument{goodsId=[129831], id=fe7a5124-d75b-40b2-93fe-5555512ea6d2, _version_=1562570354094768128}

5) solr集成结束, 但问题来了

问题1: 为什么没有配置SolrClient, 但却自动注入成功了呢?
问题2: 它是在什么地方被注入到BeanFactory的? (@Autowired能够注入成功说明该类存在于其中)
问题3: 能不能自己配置?
问题4: 有没有必要自己配置?

6) 解决问题1, 和问题2:

SolrAutoConfiguration 是Solr自动配置的类, 在Spring-Boot启动的时候会自动加载属性, 注入SolrClient类

@Configuration
@ConditionalOnClass({ HttpSolrClient.class, CloudSolrClient.class })
@EnableConfigurationProperties(SolrProperties.class)
public class SolrAutoConfiguration {

  private final SolrProperties properties;

  private SolrClient solrClient;

  public SolrAutoConfiguration(SolrProperties properties) {
    this.properties = properties;
  }

  @Bean
  @ConditionalOnMissingBean
  public SolrClient solrClient() {
    this.solrClient = createSolrClient();
    return this.solrClient;
  }

  private SolrClient createSolrClient() {
    if (StringUtils.hasText(this.properties.getZkHost())) {
      return new CloudSolrClient(this.properties.getZkHost());
    }
    return new HttpSolrClient(this.properties.getHost());
  }

}

当我们引入

<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-solr</artifactId>
  <version>${spring.data.solr.version}</version>
</dependency>

这个自动配置就会因为我们在AppMain.java上配置的@EnableAutoConfiguration注解生效, 这样就会自动注入Bean了

7) 解决问题3, 问题4

肯定是可以自己配置的, 配置方式也非常简单
只需要自己编写一个类, 使用@Configuration注解, 并且配置一个@Bean, 返回SolrClient就可以了

@Configuration
public class SolrClientConfiguration {

  @Autowired
  private Environment environment;

  @Bean
  public SolrClient solrClient() {
    System.out.println("自定义配置SolrClient");
    return new HttpSolrClient(environment.getRequiredProperty("spring.data.solr.host"));
  }
}

启动结果

2017-03-23 10:32:17.414 INFO 10359 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean  : Mapping filter: 'requestContextFilter' to: [/*]
自定义配置SolrClient
2017-03-23 10:32:18.178 INFO 10359 --- [      main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@160f0c04: startup date [Thu Mar 23 10:32:15 CST 2017]; root of context hierarchy

也就是自定义配置完成

我建议不使用自定义的配置方式, 因为它原有的自动装配已经非常方便了. 并且可以根据是否配置zookeeper来判断使用单机版或者集群版.

现在能使用SolrClient了, 剩下的是需要封装工具类, 完成客户端的查询和更新操作就OK了

以上是“Spring-Boot集成Solr客户端的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI