热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringBoot+Solr全文检索微服务简易集成

作者:JasonGofen链接:https://www.jianshu.com/p/95869ade37b3

作者:JasonGofen

链接:https://www.jianshu.com/p/95869ade37b3

本文内容主要讲解Solr 7.7.1 环境搭建后使用Spring boot 2.1.3集成SolrJ实现简易全文检索微服务,对于Solr与Spring boot的介绍内容网上资料很多,本文不再赘述。

关于本文内容所涉及资源在最后会给大家统一都列出来。

一、环境说明

Spring boot 结合 SolrJ 实现对Solr Server的访问是非常简单的,它们相互之间的关系如下图所示。

主体实现是通过在Spring boot微服务中集成SolrJ,配置好Solr Server参数,调用SolrJ中的CRUD API实现请求Solr Server端进行添加、修改、删除索引和查询的操作。至于如何结合现有业务系统,我们后面介绍。

图1 简易环境说明

下面以最简单快速的方式实现全文检索基础CRUD功能。

二、搭建Solr 7.7.1 Server端

因自己的电脑硬盘空间满了没装Linux虚拟机,就以Windows为例安装Solr Server端了。其实总体而言两个系统对Solr Server端的操作类似,各位看官举一反三就好,就两种系统部署Solr的不同下面也会做相应的提及。

  • 已配置好的Solr 7.7.1下载:

https://pan.baidu.com/s/11s18oJVKpEVc-AmZO1xkgA


我们首先来了解一下Solr的常见命令:

  • 启动:

./solr start

  • 关闭:

./solr stop -all

  • 重启:

./solr restart

  • 创建Core:

./solr create -c YourCoreName -d _default

  • 删除Core:

./solr delete -c YourCoreName

关于Solr更细致的内容,大家可以参阅下方链接:

  • Solr 官网

https://lucene.apache.org/solr/

  • Solr API官方文档

http://lucene.apache.org/solr/7_7_1/solr-solrj/index.html

  • Solr 中文文档(译版)

https://www.w3cschool.cn/solr_doc/solr_doc-t3642fkr.html


要想搭建Solr Server拢共分3步:


步骤1:部署Solr 7.7.1

步骤1-1:下载安装JDK和Solr Server端

  • 下载安装JDK 8:JDK的安装在这就不说了,网上有很多资料。\

Java SE Development Kit 8 下载

  • 下载Solr 7.7.1压缩包:请注意Linux下载solr-7.7.1.tgz,Windows下载solr-7.7.1.zip\

http://archive.apache.org/dist/lucene/solr/

步骤1-2:解压Solr-7.7.1压缩包

  • Windows下解压压缩包到对应的目录,我的路径是:

C:\myworking\solr-7.7.1

  • Linux下使用 tar 命令解压Solr压缩包:

tar zxvf solr-7.7.1.tgz -C /myworking

步骤1-3:进入bin目录运行Solr
Windows与Linux操作solr的命令都是一样的,但都需要进入到Solr的bin目录下,我的目录是C:\myworking\solr-7.7.1\binlinux的目录使用cd命令进入即可。

  • 进入的到bin目录下执行 启动 命令:

./solr start

  • 启动完成后的控制台截图:

图2 控制台Solr启动完成图

  • 随后我们访问http://localhost:8983即能看到Solr Server端的Web页面了

图3 Solr Server端 Web首页

步骤1-4:创建Core

Solr Core的创建有两种方式,第一种是通过命令行的方式,第二种是在Solr Web 首页中创建。

个人比较推荐第一种,原因有二,一是方便快捷在命令行一句话搞定,Ctrl+c Ctrl+v齐活儿,不用在页面上点来点去还得敲文字,二是所在公司大牛在实践过后说是如果采用的第二种方式创建出的Core会有一些问题。本着听人话,吃饱饭的态度就采用第一种吧~ ~*大家可以实践一下然后分享给我哦。*当然两种方式还是要介绍下的。

  • 使用命令行创建Core

我们只需要进入到上述的bin目录,复制以下命令即可创建Core,命令中的TestCore为名称可以自行替换:

./solr create -c TestCore -d _default

  • 使用Web端创建Core

上述图3中左侧的列表第3个Core Admin菜单项,点开后就明白怎么做了。

  • Web端查看TestCore

图4 选择TestCore

图5 TestCore详情图


步骤2:配置IK-Analyzer中文分词

介绍性的内容还是不罗列了,大家自己百度吧。Ik-Analyzer分词据说是国内最好用的中文分词,大部分人都用这个。目前Solr-7.7.1也自带了一个中文分词,具体的对比我没做过,等装完IK后大家回来可以进行下对比。同时欢迎分享给我哦。

  • IK分词GitHub:

https://github.com/magese/ik-analyzer-solr7

  • 动态词库自动加载:

https://github.com/liang68/ik-analyzer-solr6

http://www.cnblogs.com/liang1101/articles/6395016.html

PS:关于动态词库自动加载,这个大家看一下下面这段引用描述后视项目情况选择要不要去研究下。

如果只是在我们原有的业务系统中简单集成Solr,那暂时没必要去了解动态词库自动加载。如果像商城等业务系统中,对于搜索模块是业务系统的核心之一,那么简单使用IK可能无法达到线上使用的要求。在IK分词器中默认是一次启动将主词库、停用词以及扩展词库全部加载完毕,后续如果再想要增加额外的扩展词,就必须得修改对应的扩展词表重新打包上传并重启服务方能生效,这种方式不适合应用与线上服务。那么到底如何实现这种无缝扩充词库呢?大家可以看看上面的博客。

步骤2-1:配置IK-analyzer jar包和词库

首先需要大家下载jar包和源码,我们下面需要放到Solr Server端对应的目录下。

  • IK分词jar包:

https://search.maven.org/remotecontent?filepath=com/github/magese/ik-analyzer/7.7.1/ik-analyzer-7.7.1.jar

  • IK分词GitHub源码:

https://github.com/magese/ik-analyzer-solr7

  1. 将下载好的ik-analyzer-7.7.1.jar包放入Solr服务的 webapp\WEB-INF\lib目录下,我的目录全路径是:

C:\myworking\solr-7.7.1\server\solr-webapp\webapp\WEB-INF\lib

  1. 将下载好的ik-analyzer-solr7-master源码下的src\main\resources目录中的文件***(如下)***,放入到webapp\WEB-INF\classes目录下:

① IKAnalyzer.cfg.xml 扩展配置文件
② ext.dic 扩展词库
③ stopword.dic 停止词库
④ ik.conf 动态词库配置文件
⑤ dynamicdic.txt 动态词库

我的目录全路径是:

C:\myworking\solr-7.7.1\server\solr-webapp\webapp\WEB-INF\classses

  • 关于词库中同义词库、扩展词库、停止词库的介绍,可以看下面的blog:

https://blog.csdn.net/zcl_love_wx/article/details/52092894

步骤2-2. 配置TestCoreserver\solr\TestCore\conf\managed-schema,添加IK分词器,示例如下:












*PS:放在标签下。*同时在该标签下我们还需要配置field,请看步骤3。


步骤3:配置field

Solr filed域的配置极为重要,filed的配置会影响到索引的创建和查询出的结果展示。








name:查询时的名称
type:这个是之前定义的FieldType的名称,在这使用的ik分词
indexed:是否索引(true/false)
stored:是否存储(是否将索引结果存储到索引库)
multivalued:是否多值(一般配合copyField使用)

  • 动态filed

在定义filed时,可能会随着业务主线作出变更,那么每次在managed-schema更改filed后,还需重启Solr也是个麻烦事儿。那么在生产环境如此操作可能显得不是那么理想了。那么可以在变更时使用类似通配符的方式建立动态filed,比如name="title"可以写成name="fl_*",这样只要以fl_开头的索引都可以被建立。


步骤4:重启Solr服务,测试ik分词

这里请注意Analyse Fieldname / FieldType:右边的下拉列表,需要去选中ik分词text_ik。我们可以看到输入中华人民共和国关键字后所出现的分词效果。

图6 分词效果图

至此我们的Solr Server端基础版就搭建完成了,下面开始使用Spring boot结合SolrJ进行全文检索微服务的搭建。

三、Spring boot 微服务实现

Spring boot的基础知识不讲解了,下面我们采用Spring boot 2.1.3结合SolrJ 7.7.1完成全文检索微服务的实现。

  • 下载源码

https://github.com/JasonGofen/SolrProject


步骤1:在本地准备将要建立索引的文件

准备两个doc文档,写入一些自定内容,放到指定目录下,当然也不一定非得要doc。以下是我准备的两个文件:

C:\solrfile\data\鹅鹅鹅.pdf
C:\solrfile\data\静夜思.docx


步骤2:搭建Spring boot项目

  • 创建项目,在pom.xml引入SolrJ的Maven依赖



org.apache.solr
solr-solrj
7.7.1



org.apache.tika
tika-core
1.9

  • 目录结构

├── src
│ └── main
│ ├── java
│ │ └── com.jasongofen
│ │ ├── client
│ │ │ └── SolrClient.java // Solr客户端
│ │ ├── config
│ │ │ ├── CorsConfig.java // 跨域配置文件
│ │ │ └── SolrConfigProperties.java // yml属性实例化配置文件
│ │ ├── test
│ │ │ └── SolrCURDTest.java // Solr API调用测试示例
│ │ ├── util
│ │ │ ├── ConvertUtil.java // 自定义转换工具类
│ │ │ └── TikaUtil.java // 提取文档内容工具类
│ │ └── SolrProjectApplication.java // Spring boot启动类
│ └── resources
│ ├── application.yml // 项目配置
│ ├── banner.txt // banner配置
│ └── logback-spring.xml // 日志配置
├── pom.xml // 依赖配置
└── README.md // 项目帮助文档

  • 配置application.ymlsolr节点下的属性值***(必须)***

# solr配置
solr:
# Solr Server端地址
server: localhost:8983 # 设置你的Solr Server访问地址
# Solr Core名称
core: TestCore # 设置你的Solr Core名称
# 上面准备的文档的所在本地路径
dir: C:\solrfile\data\ # 设置你的需要建立索引的文件所在目录


步骤3:运行项目

下面就可以运行项目了,SolrJ API调用请看以下内容。
未完待续


SolrJ API调用说明

基础的API调用代码在项目目录src\main\java\com.jasongofen.test\SolrCURDTest.java文件中,该java是一个Controller可以以http请求的方式模拟其他业务系统调用过程。

  • 添加、修改索引
    添加索引时首先使用HttpSolrClientSolr Server建立连接,随后解析需要建立索引的文件*(至于需要结合现有的业务系统是采用http ftp等方式从各自的文件Server中获取,还是另外的方式,请结合当前项目业务需要作扩展即可)*,接着把解析出的文件数据放到对应的索引位置,在设置索引内容时id字段是必须要设置的且全局唯一,最后提交索引并关闭SolrClient
    修改索引时,如果id在索引库中已存在,则执行更新操作。

@GetMapping("/Add")
public void solrAdd() throws Exception {
// 设置文件路径
List files = new ArrayList<>();
files.add("鹅鹅鹅.pdf");
files.add("静夜思.docx");
// 获取Solr客户端
HttpSolrClient solr = SolrClient.getClient(solrConfigProperties.getServer());
String prefix = "";
for (String fi : files) {
System.out.println(fi);
// 取后缀名
prefix = ConvertUtil.getFileSufix(fi);
if (prefix.equalsIgnoreCase("txt") ||
prefix.equalsIgnoreCase("docx") ||
prefix.equalsIgnoreCase("doc") ||
prefix.equalsIgnoreCase("pdf")) {
String[] fileInfo = fi.split("\\.");
String cOntent= "";
// 获取文件流,取出文件内容
InputStream inputStream = new FileInputStream(solrConfigProperties.getDir() + fi);
if (prefix.equals("txt")) {
cOntent= TikaUtil.txt2String(inputStream);
} else if (prefix.equals("docx") || prefix.equals("doc") || prefix.equals("pdf")) {
cOntent= TikaUtil.doc2String(inputStream);
} else {
inputStream.close();
}
// 添加索引
SolrInputDocument solrDoc = new SolrInputDocument();
String formatDate = ConvertUtil.formatDate();
// 执行添加 ps:如果id相同,则执行更新操作
solrDoc.addField("id", UUID.randomUUID().toString().toUpperCase().replace("-", ""));
solrDoc.addField("title", fileInfo[0]);
solrDoc.addField("content", content);
solrDoc.addField("filetype", prefix);
solrDoc.addField("uploadtime", formatDate);
solr.add(solrConfigProperties.getCore(), solrDoc);
} else {
continue;
}
}
// 提交
solr.commit(solrConfigProperties.getCore());
solr.close();
}

  • 查询

查询时因返回的是JSON串,并未做前端页面展示,请根据业务需求自行定制。

@GetMapping("/Query")
public SolrDocumentList solrQuery() throws Exception {
HttpSolrClient solrClient = SolrClient.getClient(solrConfigProperties.getServer());
// 定义查询条件
Map params = new HashMap();
params.put("q", "*:*");
SolrParams mapSolrParams = new MapSolrParams(params);
//执行查询 第一个参数是collection,就是我们在solr中创建的core
QueryResponse respOnse= solrClient.query(solrConfigProperties.getCore(), mapSolrParams);
// 获取结果集
SolrDocumentList results = response.getResults();
for (SolrDocument result : results) {
// SolrDocument 数据结构为Map
System.out.println(result);
}
solrClient.close();
return results;
}

  • 删除索引

需要删除索引时,根据id去删除即可。

@GetMapping("/Delete")
public void solrDelete(@RequestParam("id") String id) throws Exception {
HttpSolrClient solrClient = SolrClient.getClient(solrConfigProperties.getServer());
// 通过id删除 执行要删除的collection(core)
solrClient.deleteById(solrConfigProperties.getCore(), id);
// 还可以通过查询条件删除
// solrClient.deleteByQuery(solrConfigProperties.getCore(), "查询条件");
// 提交删除
solrClient.commit(solrConfigProperties.getCore());
solrClient.close();
}


本文所用资源汇总:

  • 本文已配置的 Solr7.7.1
    https://pan.baidu.com/s/11s18oJVKpEVc-AmZO1xkgA

  • 本文源码
    https://github.com/JasonGofen/SolrProject

  • Solr 官网
    https://lucene.apache.org/solr/

  • Solr API 官方文档
    http://lucene.apache.org/solr/7_7_1/solr-solrj/index.html

  • Solr 中文文档(译版)
    https://www.w3cschool.cn/solr_doc/solr_doc-t3642fkr.html

  • JDK 8
    Java SE Development Kit 8 下载

  • Solr 7.7.1 压缩包
    http://archive.apache.org/dist/lucene/solr/

  • IK 分词 jar 包
    https://search.maven.org/remotecontent?filepath=com/github/magese/ik-analyzer/7.7.1/ik-analyzer-7.7.1.jar

  • IK 分词 GitHub 源码
    https://github.com/magese/ik-analyzer-solr7

  • 动态词库自动加载
    https://github.com/liang68/ik-analyzer-solr6
    http://www.cnblogs.com/liang1101/articles/6395016.html

  • 同义词典、扩展词典、停止词典介绍 Blog
    https://blog.csdn.net/zcl_love_wx/article/details/52092894

  • 创建 Spring boot 项目的网址
    https://start.spring.io/


推荐阅读
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • MACElasticsearch安装步骤及验证方法
    本文介绍了MACElasticsearch的安装步骤,包括下载ZIP文件、解压到安装目录、启动服务,并提供了验证启动是否成功的方法。同时,还介绍了安装elasticsearch-head插件的方法,以便于进行查询操作。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文详细介绍了PHP中与URL处理相关的三个函数:http_build_query、parse_str和查询字符串的解析。通过示例和语法说明,讲解了这些函数的使用方法和作用,帮助读者更好地理解和应用。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
author-avatar
沉淑梅志毓
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有