热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

springboot整合solr的方法详解

这篇文章主要介绍了springboot整合solr的方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

1、新建core并配置schema

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


   
     
     
   
   
     
     
   
  

   
  

配置完毕后启动solr。

2、相关配置

配置maven


    org.springframework.boot
    spring-boot-starter-data-solr

配置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 queryAll() {
    List bookList = new ArrayList();
    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 query(String query) {
    List bookList = new ArrayList();
    SolrQuery solrQuery = new SolrQuery();
    //设置默认搜索的域
    solrQuery.set("df", "description");
    solrQuery.setQuery(query);
    //高亮显示
    solrQuery.setHighlight(true);
    //设置高亮显示的域
    solrQuery.addHighlightField("description");
    //高亮显示前缀
    solrQuery.setHighlightSimplePre("");
    //后缀
    solrQuery.setHighlightSimplePost("");
    try {
      QueryResponse queryRespOnse= solrClient.query(solrQuery);
      if (queryRespOnse== null){
        return null;
      }
      SolrDocumentList solrDocumentList = queryResponse.getResults();
      if (solrDocumentList.isEmpty()){
        return null;
      }
      //获取高亮
      Map>> map = queryResponse.getHighlighting();
      for (SolrDocument solrDocument : solrDocumentList){
        Book book;
        List 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,传送门。


推荐阅读
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 打开文件管理器_【教程】模组管理器3.1食用指南
    文编:byakko最近有部分小伙伴反应还不会使用unity模组管理器,现在我就给大家讲一下unity模组管理器——从下载到使用。完整视频版以下是无WiF ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 学习笔记(34):第三阶段4.2.6:SpringCloud Config配置中心的应用与原理第三阶段4.2.6SpringCloud Config配置中心的应用与原理
    立即学习:https:edu.csdn.netcourseplay29983432482?utm_sourceblogtoedu配置中心得核心逻辑springcloudconfi ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
author-avatar
教坏的黑天使_203
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有