King's Studio

SpringBoot整合Elasticsearch全文搜索引擎

字数统计: 896阅读时长: 3 min
2020/05/24 Share

也参考了一些博主写的整合的内容,发现他们使用的Elasticsearch版本都比较旧,实际我在整合的过程中,SpringBoot2.2做了很好的适配,因为前面我使用的Elasticsearch版本为6.8.9,也能直接使用,但在这里我还是将对应的版本关系贴出来供参考。

Spring Data Elasticsearch Elasticsearch
3.1.x 6.2.2
3.0.x 5.5.0
2.1.x 2.4.0
2.0.x 2.2.0
1.3.x 1.5.2

由于Elasticsearch的版本更新较快,我们可以根据上面的版本关系图寻找适合的Spring Data Elasticsearch的依赖版本进行配置。

引入相关依赖

在前面的Elasticsearch的简介中已经说过了怎么使用docker部署,这边就不再重新介绍。

1
2
3
4
5
<!-- SpringBoot默认使用SpringData 进行Elasticsearch操作  -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

SpringBoot2.0中支持两种操作Elasticsearch的方式,一种是Rest Client,一种是Spring Data,在入门这块我使用Spring Data进行演示,因为操作比较简单易懂。在properties文件中添加Elasticsearch相关连接信息。

1
2
3
# 配置elasticsearch连接信息
spring.data.elasticsearch.cluster-name=docker-cluster
spring.data.elasticsearch.cluster-nodes=服务器地址:9300

此处的集群名称使用我们访问服务器的9200端口获得,注意此处的集群节点填的是9300端口,因为我们使用的是Java进行连接。

集群名称

编写实体类以及ElasticsearchRepository接口的子接口

使用Spring Data操作Elasticsearch又有两种方法,一是编写ElasticsearchRepository的子接口,二是直接使用ElasticsearchTemplate进行操作,这边介绍第一种方法,因为第一种方法较为灵活。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.ross.elasticsearch.entity;

import lombok.Data;
import org.springframework.data.elasticsearch.annotations.Document;

@Data
//由于ES中存储的都是文档,需要指定存储的对象的索引名和类型
@Document(indexName = "ross",type = "book")
public class Book {

private Integer id;
private String bookName;
private String author;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.ross.elasticsearch.repository;

import com.ross.elasticsearch.entity.Book;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import java.util.List;

//泛型中第一个是要操作的实体类的类型,第二个参数是主键的类型
public interface BookRepository extends ElasticsearchRepository<Book,Integer> {

//自定义接口方法
List<Book> findAllByBookName(String bookName);
}

往Elasticsearch中索引(保存)一个对象进行测试。

1
2
3
4
5
6
7
8
9
10
11
@Test
void contextLoads() {
Book book = new Book();
book.setId(1);
book.setBookName("三国演义");
book.setAuthor("罗贯中");

//往ES中索引(保存)一个对象
bookRepository.index(book);

}

请求URI进行结果查询,浏览器中输入http://服务器地址:9200/ross/book/_search

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
{
"took": 6,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1.0,
"hits": [
{
"_index": "ross",
"_type": "book",
"_id": "1",
"_score": 1.0,
"_source": {
"id": 1,
"bookName": "三国演义",
"author": "罗贯中"
}
}
]
}
}

编写ElasticsearchRepository的子接口灵活在可以自定义接口方法,并且无需编写方法的实现,它便能够自动进行关键字匹配。例如上面编写的findAllByBookName()方法符合And关键词匹配,我们进行方法的测试。

1
2
3
4
5
6
7
@Test
void test(){
List<Book> bookList = bookRepository.findAllByBookName("三");
for (Book book : bookList) {
System.out.println(book.getBookName());
}
}
1
三国演义

具体的自定义接口方法编写规则可以去Spring官方文档进行查看学习,地址https://docs.spring.io/spring-data/elasticsearch/docs/4.0.0.RELEASE/reference/html/#elasticsearch.repositories

总结

由于本人也刚接触ES不久,也没有相关实战项目的经历,还在学习当中,不过总结总归是好的,为以后造轮子打基础😁。

原文作者:金奇

原文链接:https://www.rossontheway.com/2020/05/24/SpringBoot整合Elasticsearch全文搜索引擎/

发表日期:May 24th 2020, 12:00:00 am

更新日期:May 24th 2020, 5:51:28 pm

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可,除特别声明外,转载请注明出处!

CATALOG
  1. 1. 引入相关依赖
  2. 2. 编写实体类以及ElasticsearchRepository接口的子接口
  3. 3. 总结