SpringBoot整合ElasticSearch实战 1、

这是我参与8月更文挑战的第28天,活动详情查看:8月更文挑战

| 作者:江夏

| CSDN:blog.csdn.net/qq_41153943

| 掘金:juejin.cn/user/651387…

| 知乎:www.zhihu.com/people/1024…

| GitHub:github.com/JiangXia-10…

本文大概6532字,读完共需18分钟

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… 选择相应的系统环境下载软件包,这里的下载应该会很慢。

图片

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

2.1、MacOS安装ElasticSearch

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

homebrew安装

1
复制代码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

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

查找安装路径

1
复制代码rpm -ql elasticsearch

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

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

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

修改该目录的拥有者为elasticsearch

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

然后设置log的目录。

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

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

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

修改配置文件elasticsearch.yml。

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

修改如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
makefile复制代码#设置节点名称
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。

1
sql复制代码systemctl start elasticsearch

查看状态

1
lua复制代码systemctl status elasticsearch

设置开机启动

1
bash复制代码systemctl enable elasticsearch

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
json复制代码{
  "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进行安装。

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

1
复制代码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 的依赖包,代码如下:

1
2
3
4
5
6
7
8
9
10
xml复制代码<!--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相关的配置:

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

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

建表语句:

1
2
3
4
5
6
7
8
sql复制代码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;

插入数据:

1
2
3
sql复制代码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', '王五');

图片

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

1
2
3
4
5
6
7
8
9
10
11
less复制代码@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进行数据访问

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
less复制代码@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文件,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
xml复制代码<!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>

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

图片

图片

4、Ending

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

往期推荐

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%