springboot+elasticSearch实现数据高效搜索

网友投稿 230 2022-09-13

springboot+elasticSearch实现数据高效搜索

ElasticSearch,正是 Elastic 公司最出名的产品之一,其中还包括有分布式日志解决方案 ELK(Elastic Search、Logstash、Kibana)、Beats、ECE等。

那 ElasticSearch 究竟有什么作用呢?

本质其实是一个基于 Lucene 开发的搜索服务器,它提供了一个基于 RESTful web 接口的分布式多用户能力的全文搜索引擎,能够达到实时搜索、稳定、可靠、快速、安装使用方便等特点。

同时,作为 Apache 许可条款下的开放源码,目前已经成为一种流行的企业级搜索引擎。

既然在企业开发中如此流行,肯定少不了 Springboot 的参与,今天我们就一起来探讨一下 SpringBoot 与 ElasticSearch 的整合,看看它是否真的如所介绍的那样优秀!

本文主要介绍分为以下几个部分:

第一部分:环境准备,安装ElasticSearch,安装 ElasticSearch-head 插件可视化web界面第二部分:SpringBoot 整合 ElasticSearch 开发第三部分:CRUD 测试

一、ElasticSearch 安装

​​   本人是在CentOS7​​来部署 ElasticSearch 服务。

建议把所需的安装包,手动从网上下载下来,因为服务器下载 ElasticSearch 安装包速度非常非常慢~~~~~

登录​​Download Elasticsearch Free | Get Started Now | Elastic | Elastic​​​,选择相应的系统环境下载软件包,我采用的是​​CentOS​​​,所以选择​​Linux​​环境。

2.1、安装JDK(已经安装过,可以跳过)

Elasticsearch 是用 Java 语言开发的,所以在安装之前,需要先安装一下JDK,环境配置起来即可。

yum -y install java-1.8.0-openjdk

查看java安装情况

java -version

2.2、安装ElasticSearch

可以用FileZilla Client把下载好的es安装包上传到服务器,输入安装命令

rpm -ivh elasticsearch-6.1.0.rpm

查找安装路径

rpm -ql elasticsearch

一般是装在​​/usr/share/elasticsearch/​​下。

2.3、设置data的目录

创建​​/data/es-data​​目录,用于elasticsearch数据的存放

mkdir -p /data/es-data

修改该目录的拥有者为elasticsearch

chown -R elasticsearch:elasticsearch /data/es-data

2.4、设置log的目录

mkdir -p /log/es-log

修改该目录的拥有者为elasticsearch

chown -R elasticsearch:elasticsearch /log/es-log

2.5、修改配置文件elasticsearch.yml

vim /etc/elasticsearch/elasticsearch.yml

修改如下内容:

#设置节点名称cluster.name: my-es#设置data存放的路径为/data/es-datapath.data: /data/es-data#设置logs日志的路径为/log/es-logpath.logs: /log/es-log#设置内存不使用交换分区,配置了bootstrap.memory_lock为true时反而会引发9200不会被监听,原因不明bootstrap.memory_lock: false#设置允许所有ip可以连接该elasticsearchnetwork.host: 0.0.0.0#开启监听的端口为92009200#增加新的参数,为了让elasticsearch-head插件可以访问es (5.x版本,如果没有可以自己手动加)true"*"

2.6、启动elasticsearch

启动

systemctl start elasticsearch

查看状态

systemctl status elasticsearch

设置开机启动

systemctl enable elasticsearch

启动成功之后,测试服务是否开启

curl -X GET --state

如果状态是​​active​​表示已经开启,可以将其关闭

#关闭防火墙systemctl stop firewalld.service

如果不想开机启动,可以输入如下命令

#禁止firewall开机启动systemctl disable firewalld.service

我们再来测试一下远程是否可以正常访问,结果如下:

已经可以正常访问了。

三、ElasticSearch-head 安装

上面我们介绍了 ElasticSearch 的安装,但是只能通过接口去查询数据,能不能通过可视化界面来查询数据呢?

ElasticSearch-head,就是一个提供可视化界面的 ElasticSearch 插件,使用 Html5 开发,本质上还是一个 nodejs 的工程,因此在使用之前需要先安装 nodeJs。

3.1、安装 nodeJs

下载nodeJS

wget -zxvf node-v10.9.0-linux-x64.tar.gz

移动解压之后的文件夹到​​/usr/local​​

mv node-v10.9.0-linux-x64 /usr/local/nodejs

创建软链接,让​​npm​​​和​​node​​命令全局生效

ln -s /usr/local/nodejs/bin/node /usr/bin/nodeln -s /usr/local/nodejs/bin/npm /usr/bin/npm

查看​​nodejs​​是否安装成功

node -vnpm -v

3.2、 安装 elasticsearch-head

如果未安装​​git​​​ ,则先安装​​git​​工具

yum install –y git

查看​​git​​安装情况

yum install –y git

从 gitHub 上拉取 elasticsearch-head 插件代码

git clone elasticsearch-head

因为​​npm​​安装非常非常慢,所以在这里先安装淘宝源地址,命令如下:

npm install cnpm -g --registry=-s /usr/local/nodejs/bin/cnpm /usr/local/bin/cnpm

使用​​cnpm​​命令下载安装项目所需要的插件

cnpm install

大概2分钟之后就安装好了,安装完成之后,修改配置信息

vim _site/app.js

将​​localhost​​​换成​​elasticsearch​​​的服务器地址,本人部署的这台是​​197.xxx.xx.xxx​​

换完之后,在​​elasticsearch-head​​目录下,输入如下命令,进入启动目录

cd node_modules/grunt/bin

使用如下命令启动服务,使​​elasticsearch-head​​服务在后台运行!

nohup ./grunt server &

最后,直接远程通过浏览器访问​​elasticsearch-head​​​可视化管理界面,默认访问地址是​​ip:9200​​,访问结果如下!

至此,​​elasticsearch​​​的安装包括可视化界面插件​​elasticsearch-head​​已经完成了!

四、SpringBoot 整合 ElasticSearch

对于 SpringBoot 来说,ElasticSearch 其实只是一个中间件,用途在于提供高效的搜索服务,比较幸运的是 SpringBoot 也为我们提供了 ElasticSearch 依赖库,添加依赖包,通过 JPA 访问非常方便,整合过程如下!

4.1、创建一个SpringBoot项目

在​​pom.xml​​中,添加依赖库 ElasticSearch 依赖包

org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-data-elasticsearch

在​​application.properties​​​中添加配置,其中节点名称​​cluster-name​​需要与上面的配置保持一致!

spring.data.elasticsearch.cluster-name=my-esspring.data.elasticsearch.cluster-nodes=197.XX.XX.207:9200

4.1、编写 CURD

我们先写一个的实体类​​Student​​,借助这个实体类来完成基础的 CRUD 功能。

新增实体类​​Student​​,其中​​indexName​​表示索引,​​type​​表示索引类别

@Data@Accessors(chain = true)@Document(indexName = "student", type = "school")public class Student { private static final long serialVersionUID = 1l; @Id private String id; private String name; private String gender; private Integer age;}

注意​​id​​​字段是必须的,可以不写注解​​@Id​​!

使用 JPA 作为数据持久层,接口继承自​​ElasticsearchRepository​​,同时新增两个自定义查询方法

public interface StudentRepository extends ElasticsearchRepository { /** * 通过姓名模拟查询学生信息 * @param keyword * @return */ List findByNameLike(String keyword); /** * 自定义查询,固定匹配查询学生信息 * @param keyword * @return */ @Query("{\"match_phrase\":{\"name\":\"?0\"}}") List findByNameCustom(String keyword);}

创建控制层,编写基础的 CRUD 功能

@RestController@RequestMapping("/student")public class StudentController { @Autowired private StudentRepository studentRepository; @Autowired private ElasticsearchTemplate elasticsearchTemplate; /** * 批量添加 * @param students * @return */ @PostMapping("/batchAdd") public void add(@RequestBody List students){ studentRepository.saveAll(students); } /** * 添加 * @param student * @return */ @PostMapping("/add") public void add(@RequestBody Student student){ studentRepository.save(student); } /** * 修改 * @param student * @return */ @PostMapping("/update") public void updateById(@RequestBody Student student){ studentRepository.save(student); } /** * 删除 * @param id * @return */ @PostMapping("/delete/{id}") public void deleteById(@PathVariable String id){ studentRepository.deleteById(id); } /** * 获取所有信息 * @return */ @GetMapping("/get") public Object getAll(){ Iterable iterable = studentRepository.findAll(); List list = new ArrayList<>(); iterable.forEach(list :: add); return list; } /** * 查询指定ID * @param id * @return */ @GetMapping("/get/{id}") public Object getById(@PathVariable String id){ if(StringUtils.isEmpty(id)){ return Result.error(); } Optional studentOptional = studentRepository.findById(id); if(studentOptional.isPresent()){ return studentOptional.get(); } return null; } /** * 普通搜索 * @param keyword * @return */ @GetMapping("/search/name") public Object searchName(String keyword){ List students = studentRepository.findByNameLike(keyword); return students; } /** * 自定义匹配 * 普通搜索 * @param keyword * @return */ @GetMapping("/search/name/custom") public Object searchTitleCustom(String keyword){ List students = studentRepository.findByNameCustom(keyword); return students; } /** * 高级搜索,可以自定义添加搜索字段 * @param keyword * @return */ @GetMapping("/top/search/name") public Object topSearchTitle(String keyword){ SearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(queryStringQuery(keyword)) .build(); //使用searchQuery进行搜索 List students = elasticsearchTemplate.queryForList(searchQuery, Student.class); return students; }}

4.2、CRUD 测试

CRUD 编写完了,我们验证一下是否可以正常操作,启动 springboot 项目,使用 postman 进行测试。

批量新增、新增功能测试

执行之后,登录可视化界面查询界面,选择索引​​student​​,可以很清晰的看到数据已经进去了

修改功能测试,修改时需要传入​​ID​​

删除功能测试,只需要传入​​ID​​

查询功能测试,查询所有数据

查询功能测试,查询指定​​ID​​信息

正在上传…重新上传取消

查询功能测试,普通模糊查询,ElasticSearch 会对关键词进行拆分,只要有包含关键字的都会查询出来,例如输入​​王张​​,会将包含​​王​​或者​​张​​的姓名信息查询出来查询功能测试,高级查询,这个是使用官方api提供的查询入口,可以在方法中进行自定义搜索

五、总结

elasticsearch 在海量数据查询方面,非常高效,本来想写在大量数据查询方面,数据库与 elasticsearch 的查询效率比对,由于篇幅较长会造成阅读体验降低,后面文章中再次介绍这个部分。

对于想学习 elasticsearch 的新手,尤其是安装部分可能比较困难,因此花的编写时间比较多,后续的整合都比较简单,elasticsearch 真正的强大的地方在于高效信息搜索,本篇对 elasticsearch 的搜索只是做一个基础的介绍,具体的高级搜索方法大家可以​​参考官方文档 API​​,本篇可以看作为 elasticsearch 搜索服务入门的教程!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:34亿销售投入换来27亿年亏损!“完美日记”营销向左研发向右!
下一篇:Kubernetes 基于Kubectl的GitOps CI/CD
相关文章

 发表评论

暂时没有评论,来抢沙发吧~