SpringBoot整合ElasticSearch实战

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 在说ElasticSearch之前先来说说什么是搜索引擎。搜索引擎,即Search Engine,是一个帮助用户搜索他们需要内容的计算机程序,即把计算机中存储的信息与用户的信息需求(information need)相匹配,并把匹配的结果展示出来。简单点说,搜索引擎就是万维网环境中的为了使网民搜索信息的速度更加快捷、准确信息检索系统。常见的搜索引擎有百度、谷歌、搜狗等。

1、什么是ElasticSearch


在说ElasticSearch之前先来说说什么是搜索引擎。搜索引擎,即Search Engine,是一个帮助用户搜索他们需要内容的计算机程序,即把计算机中存储的信息与用户的信息需求(information need)相匹配,并把匹配的结果展示出来。简单点说,搜索引擎就是万维网环境中的为了使网民搜索信息的速度更加快捷、准确信息检索系统。常见的搜索引擎有百度、谷歌、搜狗等。


Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎,它提供了一个基于 RESTful web 接口的分布式多用户能力的全文搜索引擎,能够达到实时搜索、稳定、可靠、快速、安装使用方便等特点。它不仅包括了全文搜索功能,还可以进行以下工作:


  • 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。


  • 实时分析的分布式搜索引擎。


  • 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。


Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。

这篇文章就记录一下 SpringBoot 与 ElasticSearch 的整合。


2、ElasticSearch 安装


前面说到Elasticsearch是用Java语言开发的,所以在安装Elasticsearch之前需要先安装配置java环境。


然后登录www.elastic.co/cn/download… 选择相应的系统环境下载软件包,这里的下载应该会很慢。


62a8d148a83b458dbfd1b1dd33b71edb~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


这里介绍Mac、Linux、Windows系统三种安装ElasticSearch的方式。2.1、Mac安装ElasticSearch


2.1、MacOS安装ElasticSearch


首先下载对应的MacOS的安装包。


homebrew安装


brew install elasticsearch
复制代码


运行


  • 查看状态


$ brew services list


  • 启动


$ brew services start elasticsearch


  • 重启


$ brew services restart elasticsearch


  • 停止


$ brew services stop elasticsearch


浏览器输入 http://localhost:9200 查看ES是否运行


2.2、Linux安装ElasticSearch


进入到对应上传的文件夹,安装ElasticSearch


rpm -ivh elasticsearch-6.1.0.rpm
复制代码


查找安装路径


rpm -ql elasticsearch
复制代码


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


然后设置data的目录:创建/data/es-data目录,用于elasticsearch数据的存放


mkdir -p /data/es-data
复制代码


修改该目录的拥有者为elasticsearch


chown -R elasticsearch:elasticsearch /data/es-data
复制代码


然后设置log的目录。


mkdir -p /log/es-log
复制代码


修改该目录的拥有者为elasticsearch。


chown -R elasticsearch:elasticsearch /log/es-log
复制代码


修改配置文件elasticsearch.yml。


vim /etc/elasticsearch/elasticsearch.yml
复制代码


修改如下内容:


#设置节点名称
cluster.name: my ElasticSearch
#设置data存放的路径为/data/es-data
path.data: /data/es-data
#设置logs日志的路径为/log/es-log
path.logs: /log/es-log
#设置内存不使用交换分区,配置了bootstrap.memory_lock为true时反而会引发9200不会被监听,原因不明
bootstrap.memory_lock: false
#设置允许所有ip可以连接该elasticsearch
network.host: 0.0.0.0
#开启监听的端口为9200
http.port: 9200
#增加新的参数,为了让elasticsearch-head插件可以访问elasticsearchhttp.cors.enabled: true
http.cors.allow-origin: "*"
复制代码


启动elasticsearch。


systemctl start elasticsearch
复制代码


查看状态


systemctl status elasticsearch
复制代码


设置开机启动


systemctl enable elasticsearch
复制代码


启动成功之后,测试服务是否开启,或者浏览器访问。


curl -X GET http://localhost:9200
复制代码


返回如下信息,说明安装、启动成功了。


{
  "name": "pYAFJhz",
  "cluster_name": "my ElasticSearch",
  "cluster_uuid": "oC28y-cNQduGItC7qq5W8w",
  "version": {
    "number": "6.8.2",
    "build_flavor": "oss",
    "build_type": "tar",
    "build_hash": "b506955",
    "build_date": "2020-07-07T20:24:41.545295Z",
    "build_snapshot": false,
    "lucene_version": "7.7.0",
    "minimum_wire_compatibility_version": "5.6.0",
    "minimum_index_compatibility_version": "5.0.0"
  },
  "tagline": "You Know, for Search"
}
复制代码


2.3、Windows安装ElasticSearch


下载安装包,解压,然后双击执行 bin/elasticsearch.bat进行安装。


安装完成后运行命令提示符


elasticsearch.bat -d
复制代码


或者直接双击执行elasticsearch.bat


浏览器输入 http://localhost:9200 查看ES是否运行。


或者下载cURL,使用cURL的方式验证:


curl 'http://localhost:9200/?pretty'


返回结果同上,则安装成功。


3、SpringBoot 整合 ElasticSearch


上面的都是准备工作。安装好ElasticSearch之后,就使用SpringBoot来整合ElasticSearch 进行实战开发。SpringBoot 提供了 ElasticSearch 依赖库,只需要添加依赖包,通过 JPA 访问非常方便。


首先创建一个SpringBoot项目,我这里使用的IDEA,如果还不会使用创建springboot项目的可以参考这篇文章:SpringBoot入门:使用IDEA和Eclipse构建第一个SpringBoot项目


创建好springboot项目之后,在pom.xml中,添加依 ElasticSearch和JPA 的依赖包,代码如下:


<!--jpa 支持-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--elasticsearch-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
复制代码


之后新建一个application.properties文件,然后添加ElasticSearch相关的配置:


spring.data.elasticsearch.cluster-name=my ElasticSearch
spring.data.elasticsearch.cluster-nodes=192.168.5.229:9200
复制代码


这里我在数据库创建了一个user表,并插入数据。


建表语句:


CREATE TABLE `user` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
 `email` varchar(255) NOT NULL COMMENT '邮箱',
 `password` varchar(255) NOT NULL COMMENT '密码',
 `username` varchar(255) NOT NULL COMMENT '姓名',
 PRIMARY KEY (`id`),
 UNIQUE KEY `email` (`email`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
复制代码


插入数据:


INSERT INTO `user` VALUES ('1', '1@qq.com', '123456', '张三');
INSERT INTO `user` VALUES ('2', '2@qq.com', '234567', '李四');
INSERT INTO `user` VALUES ('3', '3@qq.com', '345678', '王五');
复制代码


4d0765ad06cc45aa856a26881a880aba~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


前面的都是一些准备的工作,后面开始正式些后台的代码。首先新建一个实体类,命名为,User,代码如下:


@Data
@Accessors(chain = true)
// indexName表示索引,type表示索引类别
@Document(indexName = "user", type = "person")
public class User{
    @Id
    private String id;
    private String email;
    private String password;
    private String username;
}
复制代码


这里使用 JPA 作为数据持久层,接口继承自ElasticsearchRepository,同时新增两个自定义查询方法。关于JPA的使用可以参考:SpringBoot整合JPA进行数据访问


public interface userRepository extends ElasticsearchRepository<Student, String> {
    List<User> findUserByName(String username);
}
复制代码


创建控制层,核心逻辑代码如下:


@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserRepository userRepository;
    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;
    /**
     * 查询指定ID
     */
    @GetMapping("/get/{id}")
    public Object getById(@PathVariable String id){
        if(StringUtils.isEmpty(id)){
            return Result.error();
        }
        Optional<User> studentOptional = userRepository.findById(id);
        if(userOptional.isPresent()){
            return userOptional.get();
        }
        return null;
    }
    /**
     * 普通搜索
     */
    @GetMapping("/search/username")
    public Object searchName(String username){
        List<User> users = userRepository.findByName(username);
        return users;
    }
}
复制代码


然后开始写前端页面,用来结果的展示。在webapp下新建一个index.html文件,代码如下:


<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>SSMDemo</title>
</head>
<script>
    //selectUser按钮的js功能代码
    function selectUser() {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange = function () {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                document.getElementById("test").innerHTML = xmlhttp.responseText;
            }
        }
        xmlhttp.open("POST", "/get/{id}", true);
        xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xmlhttp.send("id=2");
    }
    //SearchUser按钮的js功能代码
    function SearchUser() {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange = function () {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                document.getElementById("test").innerHTML = xmlhttp.responseText;
            }
        }
        xmlhttp.open("POST", "/search/username", true);
        xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xmlhttp.send("username=王五");
    }
</script>
<body>
<p id="test">Hello World</p>
<button type="button" onclick="selectUser()">查询用户</button>
<button type="button" onclick="SearchUser()">搜索用户</button>
</body>
</html>
复制代码


运行项目项目,测试结果如下:


cb15e0120c5d4bce81597e7951024440~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp (1).jpg


cad8d8f440fe4a12aedb71322a3bc010~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg

4、Ending

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。所以Elasticsearch 真正强大和公司使用较多的是在海量数据查询方面。但由于实际数据量和篇幅有限,这里只是简单的介绍一下有关Elasticsearch 入门相关的知识,感兴趣的同学可以后续继续学习Elasticsearch 相关的知识,如果有问题或不正确的地方可以在下方或后台留言讨论交流。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
7天前
|
缓存 NoSQL Java
Springboot实战——黑马点评之秒杀优化
【9月更文挑战第27天】在黑马点评项目中,秒杀功能的优化对提升系统性能和用户体验至关重要。本文提出了多项Spring Boot项目的秒杀优化策略,包括数据库优化(如索引和分库分表)、缓存优化(如Redis缓存和缓存预热)、并发控制(如乐观锁、悲观锁和分布式锁)以及异步处理(如消息队列和异步任务执行)。这些策略能有效提高秒杀功能的性能和稳定性,为用户提供更佳体验。
|
2月前
|
网络协议 Java API
SpringBoot整合Elasticsearch-Rest-Client、测试保存、复杂检索
这篇文章介绍了如何在SpringBoot中整合Elasticsearch-Rest-Client,并提供了保存数据和进行复杂检索的测试示例。
SpringBoot整合Elasticsearch-Rest-Client、测试保存、复杂检索
|
2月前
|
NoSQL Java Redis
Redis6入门到实战------ 八、Redis与Spring Boot整合
这篇文章详细介绍了如何在Spring Boot项目中整合Redis,包括在`pom.xml`中添加依赖、配置`application.properties`文件、创建配置类以及编写测试类来验证Redis的连接和基本操作。
Redis6入门到实战------ 八、Redis与Spring Boot整合
|
2月前
|
Java API UED
【实战秘籍】Spring Boot开发者的福音:掌握网络防抖动,告别无效请求,提升用户体验!
【8月更文挑战第29天】网络防抖动技术能有效处理频繁触发的事件或请求,避免资源浪费,提升系统响应速度与用户体验。本文介绍如何在Spring Boot中实现防抖动,并提供代码示例。通过使用ScheduledExecutorService,可轻松实现延迟执行功能,确保仅在用户停止输入后才触发操作,大幅减少服务器负载。此外,还可利用`@Async`注解简化异步处理逻辑。防抖动是优化应用性能的关键策略,有助于打造高效稳定的软件系统。
41 2
|
2月前
|
JSON Java API
解码Spring Boot与JSON的完美融合:提升你的Web开发效率,实战技巧大公开!
【8月更文挑战第29天】Spring Boot作为Java开发的轻量级框架,通过`jackson`库提供了强大的JSON处理功能,简化了Web服务和数据交互的实现。本文通过代码示例介绍如何在Spring Boot中进行JSON序列化和反序列化操作,并展示了处理复杂JSON数据及创建RESTful API的方法,帮助开发者提高效率和应用性能。
69 0
|
2月前
|
SQL Java 数据库连接
Spring Boot联手MyBatis,打造开发利器:从入门到精通,实战教程带你飞越编程高峰!
【8月更文挑战第29天】Spring Boot与MyBatis分别是Java快速开发和持久层框架的优秀代表。本文通过整合Spring Boot与MyBatis,展示了如何在项目中添加相关依赖、配置数据源及MyBatis,并通过实战示例介绍了实体类、Mapper接口及Controller的创建过程。通过本文,你将学会如何利用这两款工具提高开发效率,实现数据的增删查改等复杂操作,为实际项目开发提供有力支持。
61 0
|
2月前
|
Java 开发者 Spring
Spring Boot实战宝典:揭秘定时任务的幕后英雄,让业务处理如流水般顺畅,轻松驾驭时间管理艺术!
【8月更文挑战第29天】在现代应用开发中,定时任务如数据备份、报告生成等至关重要。Spring Boot作为流行的Java框架,凭借其强大的集成能力和简洁的配置方式,为开发者提供了高效的定时任务解决方案。本文详细介绍了如何在Spring Boot项目中启用定时任务支持、编写定时任务方法,并通过实战案例展示了其在业务场景中的应用,同时提供了注意事项以确保任务的正确执行。
37 0
|
2月前
|
Dubbo Java Nacos
【实战攻略】破解Dubbo+Nacos+Spring Boot 3 Native打包后运行异常的终极秘籍——从零开始彻底攻克那些让你头疼不已的技术难题!
【8月更文挑战第15天】Nacos作为微服务注册与配置中心受到欢迎,但使用Dubbo+Nacos+Spring Boot 3进行GraalVM native打包后常遇运行异常。本文剖析此问题及其解决策略:确认GraalVM版本兼容性;配置反射列表以支持必要类和方法;采用静态代理替代动态代理;检查并调整配置文件;禁用不支持的功能;利用日志和GraalVM诊断工具定位问题;根据诊断结果调整GraalVM配置。通过系统排查方法,能有效解决此类问题,确保服务稳定运行。
68 0
|
2月前
|
自然语言处理 Java 关系型数据库
ElasticSearch 实现分词全文检索 - SpringBoot 完整实现 Demo 附源码【完结篇】
ElasticSearch 实现分词全文检索 - SpringBoot 完整实现 Demo 附源码【完结篇】
32 0
|
2月前
|
自然语言处理 Java 索引
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 文档操作
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 文档操作
31 0
下一篇
无影云桌面