springboot整合solr的方法详解

 更新时间:2019年08月19日 16:06:43   作者:Leon_W  
这篇文章主要介绍了springboot整合solr的方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这一篇写一下springboot整合solr,代码已经上传到github,传送门

1、新建core并配置schema

solr create -c "book_core" ,配置分词器并且field类型定义为分词器类型。

<fieldType name="ik_word" class="solr.TextField">
   <analyzer type="index">
     <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
     <filter class="solr.LowerCaseFilterFactory"/>
   </analyzer>
   <analyzer type="query">
     <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
     <filter class="solr.LowerCaseFilterFactory"/>
   </analyzer>
  </fieldType>

   <!-- 自定义添加filed -->
  <field name="description" type="ik_word" indexed="true" stored="true"/>

配置完毕后启动solr。

2、相关配置

配置maven

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>

配置application.properties相关solr的内容

# solr配置
spring.data.solr.host=http://localhost:8983/solr/book_core

如果想同时使用好几个core,通过HttpSolrClient solrClient = new HttpSolrClient(url);构造出对应core的solrClient进行相关操作。

3、solr增删改查

3.1、新增实体

@SolrDocument(solrCoreName = "book_core")
public class Book {

  @Id
  @Field
  private String id;

  @Field
  private String description;

  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  public String getDescription() {
    return description;
  }

  public void setDescription(String description) {
    this.description = description;
  }
}

在这里要说明一下 实体类上的注解@field和@SolrDocument 是为了QueryResponse.getBeans()能转化成相关实体类,不然无法识别。

3.2增删改

@Autowired
  SolrClient solrClient;

  @Override
  public void add(Book book) {
    SolrInputDocument document = new SolrInputDocument();
    document.setField("id",book.getId());
    document.setField("description",book.getDescription());
    try {
      solrClient.add(document);
      solrClient.commit();
    } catch (SolrServerException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  @Override
  public void delete(String query) {
    try {
      solrClient.deleteByQuery(query);
      solrClient.commit();
    } catch (SolrServerException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  @Override
  public Book update(Book book) {
    try {
      solrClient.addBean(book);
      solrClient.commit();
    } catch (IOException e) {
      e.printStackTrace();
    } catch (SolrServerException e) {
      e.printStackTrace();
    }
    return book;
  }

增加删除修改都差不多,增加和修改可以通过add(SolrInputDocument)和addBean,根据主键是否存在来判断是新增还是修改,删除可以通过主键或者条件进行删除。增删改之后一定要记得commit!

主键是在schema中配置的,默认有 id字段做主键,也可以自定义主键,在schema中配置。

通过add方法加了几个demo后,可以在solr管理页面的查询出查看添加的内容

3.3查询

查询则通过SolrQuery入参进行查询

@Override
  public List<Book> queryAll() {
    List<Book> bookList = new ArrayList<Book>();
    SolrQuery solrQuery = new SolrQuery();
    solrQuery.setQuery("*:*");
    try {
      QueryResponse queryResponse = solrClient.query(solrQuery);
      if (queryResponse != null){
        bookList = queryResponse.getBeans(Book.class);
      }
    } catch (SolrServerException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return bookList;

同时我写了一个jsp页面来展示查询结果。

到此,增删改查的基本操作都已经实现了,更多高级用法可以参考官方api文档。

4、高亮

一开始在尝试使用高亮时发现无法起作用,排查后发现高亮是在QueryResponse中的另一个结果集的。

QueryResponse.getHighlighting()

取出来的字段值为自定义前缀后缀拼接具体字段值。

@Override
  public List<Book> query(String query) {
    List<Book> bookList = new ArrayList<Book>();
    SolrQuery solrQuery = new SolrQuery();
    //设置默认搜索的域
    solrQuery.set("df", "description");
    solrQuery.setQuery(query);
    //高亮显示
    solrQuery.setHighlight(true);
    //设置高亮显示的域
    solrQuery.addHighlightField("description");
    //高亮显示前缀
    solrQuery.setHighlightSimplePre("<font color='red'>");
    //后缀
    solrQuery.setHighlightSimplePost("</font>");
    try {
      QueryResponse queryResponse = solrClient.query(solrQuery);
      if (queryResponse == null){
        return null;
      }
      SolrDocumentList solrDocumentList = queryResponse.getResults();
      if (solrDocumentList.isEmpty()){
        return null;
      }
      //获取高亮
      Map<String, Map<String, List<String>>> map = queryResponse.getHighlighting();
      for (SolrDocument solrDocument : solrDocumentList){
        Book book;
        List<String> list = map.get(solrDocument.get("id")).get("description");
        if (!CollectionUtils.isEmpty(list)){
          solrDocument.setField("description",list.get(0));
        }
        String bookStr = JSONUtil.toJSON(solrDocument);
        book = JSON.parseObject(bookStr,Book.class);
        bookList.add(book);
      }
    } catch (SolrServerException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return bookList;
  }

页面展示如下:

搜索框分词之后,搜索出来的带有高亮的值。

增删改查最基本的应用就差不多了,更高级的代码请查看官方api文档。上文中所有代码都上传至github,传送门

相关文章

  • 使用JSCH框架通过跳转机访问其他节点的方法

    使用JSCH框架通过跳转机访问其他节点的方法

    下面小编就为大家分享一篇使用JSCH框架通过跳转机访问其他节点的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Java Fork/Join框架

    Java Fork/Join框架

    Fork/Join框架是Java7中新增的一项特性,也是Java7平台的其中一项主要改进。下面我们就来简单探讨下Java的Fork/Join框架
    2016-09-09
  • Java Math类、Random类、System类及BigDecimal类用法示例

    Java Math类、Random类、System类及BigDecimal类用法示例

    这篇文章主要介绍了Java Math类、Random类、System类及BigDecimal类用法,结合实例形式分析了java数值运算相关的Math类、Random类、System类及BigDecimal类基本功能与使用技巧,需要的朋友可以参考下
    2019-03-03
  • Java实战项目之斗地主和斗牛游戏的实现

    Java实战项目之斗地主和斗牛游戏的实现

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用Java实现一个斗地主和一个斗牛游戏,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • 基于Java实现空间滤波完整代码

    基于Java实现空间滤波完整代码

    空间滤波是一种采用滤波处理的影像增强方法。其理论基础是空间卷积和空间相关。这篇文章主要介绍了基于Java的空间滤波代码实现,需要的朋友可以参考下
    2021-08-08
  • Java语言十大基础特性分析

    Java语言十大基础特性分析

    这篇文章介绍了Java语言十大基础特性,它有哪些优势,需要的朋友可以参考下。
    2017-08-08
  • Java中的BlockingQueue接口源码解析

    Java中的BlockingQueue接口源码解析

    这篇文章主要介绍了Java中的BlockingQueue接口源码解析,BlockingQueue接口表示阻塞队列,是Java并发包中阻塞队列的接口定义规范,阻塞队列意味着对于该队列的操作是线程安全的,当多个线程存放元素进入队列或者从队列中取出元素都是线程安全的,需要的朋友可以参考下
    2023-11-11
  • Java使用Apache Commons高效处理CSV文件的操作指南

    Java使用Apache Commons高效处理CSV文件的操作指南

    在 Java 开发中,CSV(Comma-Separated Values,逗号分隔值)是一种常见的数据存储格式,广泛用于数据交换和简单的存储任务,本文将介绍Java使用Apache Commons高效处理CSV文件的操作指南,需要的朋友可以参考下
    2025-03-03
  • java中断线程的正确姿势完整示例

    java中断线程的正确姿势完整示例

    这篇文章主要为大家介绍了java中断线程的正确姿势完整示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • SpringBoot集成JWT实现登陆验证的方法详解

    SpringBoot集成JWT实现登陆验证的方法详解

    JSON Web Token(JWT)是一个开放的标准(RFC 7519),它定义了一个紧凑且自包含的方式,用于在各方之间以JSON对象安全地传输信息。本文将利用SpringBoot集成JWT实现登陆验证,感兴趣的可以了解一下
    2022-05-05

最新评论