一篇解决Springboot 整合 Elasticsearch

ElasticSearch

结合业务的场景,在目前的商品体系需要构建搜索服务,主要是为了提供用户更丰富的检索场景以及高速,实时及性能稳定的搜索服务。

ElasticSearch是一个基于Lucene的搜索服务器,其实就是对Lucene进行封装,提供了RESTAPI 的操作接口。

ElasticSearch作为一个高度可拓展的开源全文搜索和分析引擎,可用于快速地对大数据进行存储,搜索和分析。

ElasticSearch主要特点:分布式、高可用、异步写入、多API、面向文档 。

ElasticSearch核心概念:近实时,集群,节点(保存数据),索引,分片(将索引分片),副本(分片可设置多个副本) 。它可以快速地储存、搜索和分析海量数据。

Docker搭建 Elasticsearch

安装Elasticsearch的Docker镜像

目前Elasticsearch 版本到了7.X, Springboot 目前不支持7.X以上的elasticsearch。所以还是选择了稳定的2.4.6

<code>ubuntu@VM-0-5-ubuntu:~$ docker pull elasticsearch:2.4.6
2.4.6: Pulling from library/elasticsearch
05d1a5232b46: Already exists
5cee356eda6b: Already exists
89d3385f0fd3: Already exists
65dd87f6620b: Already exists
78a183a01190: Already exists

1a4499c85f97: Already exists
2c9d39b4bfc1: Already exists
1b1cec2222c9: Already exists
59ff4ce9df68: Already exists
1976bc3ee432: Already exists
a27899b7a5b5: Already exists
b0fc7d2c927a: Already exists
6d94b96bbcd0: Already exists
6f5bf40725fd: Already exists
2bf2a528ae9a: Already exists
Digest: sha256:41ed3a1a16b63de740767944d5405843db00e55058626c22838f23b413aa4a39
Status: Downloaded newer image for elasticsearch:2.4.6
docker.io/library/elasticsearch:2.4.6
ubuntu@VM-0-5-ubuntu:~$ docker run -d -p 9200:9200 -p 9300:9300 --name elasticsearch elasticsearch:2.4.6
# 如果跑不了,与服务器的内存有关
ubuntu@VM-0-5-ubuntu:~$ docker run -e ES_JAVA_OPIS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 --name elasticsearch elasticsearch:2.4.6
4e54a696130f92c7a94835313a36e359e51cf02f08e85fc281667e4a238cf5e9/<code>

访问服务器的9200端口,测试是否成功搭建Elasticsearch

原创 | 一篇解决Springboot 整合 Elasticsearch

springboot搭建 Elasticsearch工程

选择NOSQL中的 Elasticsearch依赖

原创 | 一篇解决Springboot 整合 Elasticsearch

pom.xml项目配置依赖

<code> <dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-data-elasticsearch/<artifactid>
/<dependency>
<dependency>
<groupid>org.springframework.boot/<groupid>
<artifactid>spring-boot-starter-web/<artifactid>
/<dependency>/<code>

SpringBoot默认支持两种技术来和ES交互

  1. Jest(默认不生效)

需要导入jest的工具包(io.searchbox.client.JestClient)

  1. SpringData ElasticSearch【ES版本有可能不合适】

Jest

Jest是Elasticsearch 的Java Http Rest 客户端。

ElasticSearch已经具备应用于Elasticsearch内部的Java API,但是Jest弥补了ES自有API缺少Elasticsearch Http Rest接口客户端的不足。

去maven仓库搜jest

链接: https://mvnrepository.com/artifact/io.searchbox/jest

原创 | 一篇解决Springboot 整合 Elasticsearch

记得在pom文件中引入jest,先注释掉ElasticSearch的依赖:

<code>





<dependency>
<groupid>io.searchbox/<groupid>
<artifactid>jest/<artifactid>
<version>2.4.0/<version>
/<dependency>/<code>

Jest使用默认配置JestAutoConfiguration,而JestAutoConfiguration注入一个JestClient,要使用这个客户端,要先在配置文件中指定es的地址:

application.properties配置文件

<code>spring.elasticsearch.jest.uris=http://ip:9200/<code>

跑起来看看是否连接成功

原创 | 一篇解决Springboot 整合 Elasticsearch

Jest实战演练

创建bean.Article类,私有变量id, author,title,content,补充Getter和Setter

@JestId

<code>import io.searchbox.annotations.JestId;
/**
* @author: 毛利
*/
public class Article {

@JestId
private Integer id;
private String author;
private String title;
private String content;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getAuthor() {
return author;
}

public void setAuthor(String author) {
this.author = author;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getContent() {
return content;
}


public void setContent(String content) {
this.content = content;
}
}
/<code>
原创 | 一篇解决Springboot 整合 Elasticsearch

ElasticsearchApplicationTests测试类中

原创 | 一篇解决Springboot 整合 Elasticsearch

<code>@Autowired
JestClient jestClient;

@Test
void contextLoads() {
// 给Es中索引(保存)一个文档;
Article article = new Article();
article.setId(1);
article.setTitle("好消息");
article.setAuthor("zhangsan");
article.setContent("Hello World");
// 构建一个索引功能
Index index = new Index.Builder(article).index("atguigu").type("news").build();
try {
jestClient.execute(index);
} catch (IOException e) {
e.printStackTrace();
}
}/<code>

运行测试,访问http://ip:9200/atguigu/news/1

原创 | 一篇解决Springboot 整合 Elasticsearch

测试搜索

<code>@Test
void search() {

//查询表达式 content有hello
String json = "{\\n" +
" \"query\" : {\\n" +
" \"match\" : {\\n" +
" \"content\" : \"hello\"\\n" +
" }\\n" +
" }\\n" +
"}";


//构建搜索功能
Search search = new Search.Builder(json).addIndex("atguigu").addType("news").build();

//执行
try {
SearchResult result = jestClient.execute(search);
System.out.println(result.getJsonString());
} catch (IOException e) {
e.printStackTrace();
}
}/<code>

更多操作:https://github.com/searchbox-io/Jest/tree/master/jest

测试运行

原创 | 一篇解决Springboot 整合 Elasticsearch

运行如下

SpringData ElasticSearch

还有一个SpringData ElasticSearch

pom文件打开SpringData ElasticSearch依赖

注意Elasticsearch和spring-boot-starter-data-elasticsearch版本对应

原创 | 一篇解决Springboot 整合 Elasticsearch

新新版本的SpringBoot 2的spring-boot-starter-data-elasticsearch中支持的Elasticsearch版本是2.X, 但Elasticsearch实际上已经发展到6.5.X版本了,为了更好的使用Elasticsearch的新特性, 所以弃用了spring-boot-starter-data-elasticsearch依赖,而改为直接使用Spring-data-elasticsearch

原创 | 一篇解决Springboot 整合 Elasticsearch

Docker安装Elasticsearch镜像6.X,和上面一样

<code>docker pull elasticsearch:6.8.6
# 加速
docker pull registry.docker-cn.com/library/elasticsearch:6.8.6
docker run -d -p 9201:9200 -p 9301:9300 --name elasticsearch elasticsearch:6.8.6
# 我发现内存空间不够,好像很多人死在那
docker run --name elasticsearch -d -e ES_JAVA_OPTS="-Xms128m -Xmx128m" -e "discovery.type=single-node" -p 9201:9200 -p 9301:9300 elasticsearch:6.8.6/<code>
原创 | 一篇解决Springboot 整合 Elasticsearch

访问测试OK

docker-cluster这里创建一个容器变了

application.properties配置文件

<code>spring.data.elasticsearch.cluster-name=docker-cluster
spring.data.elasticsearch.cluster-nodes=ip:9301/<code>

跑起来测试下

原创 | 一篇解决Springboot 整合 Elasticsearch

SpringData ElasticSearch就是编写一个ElasticsearchRepository 的子接口来操作ES

SpringData ElasticSearch实战演练

新建bean.Book类,三个类变量,补充Getter和Setter

ElasticSearch是面对文档的

@Document(indexName = "atguigu", type = "book") 补充文档:index序列和type

原创 | 一篇解决Springboot 整合 Elasticsearch

<code>import org.springframework.data.elasticsearch.annotations.Document;
/**
* @author: 毛利
*/
@Document(indexName = "atguigu", type = "book")
public class Book {
private Integer id;

private String bookName;

private String author;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getBookName() {
return bookName;
}

public void setBookName(String bookName) {
this.bookName = bookName;
}

public String getAuthor() {
return author;
}

public void setAuthor(String author) {
this.author = author;
}

@Override
public String toString() {
return "Book{" +
"id=" + id +
", bookName='" + bookName + '\\'' +
", author='" + author + '\\'' +
'}';
}
}
/<code>

编写repository.BookRepository接口继承ElasticsearchRepository接口

原创 | 一篇解决Springboot 整合 Elasticsearch

同时重写findByBookNameLike`方法

<code>import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;

/**
* @author: 毛利
*/
public interface BookRepository extends ElasticsearchRepository<book> {
public List<book> findByBookNameLike(String bookName);
}/<book>/<book>/<code>

测试类

<code>@Autowired
BookRepository bookRepository;

@Test
public void test02() {
\tBook book = new Book();
\tbook.setId(1);
\tbook.setBookName("西游记");
\tbook.setAuthor("吴承恩");
\tbookRepository.index(book);
}/<code>

运行测试类后,访问是否找到book1

原创 | 一篇解决Springboot 整合 Elasticsearch

原创 | 一篇解决Springboot 整合 Elasticsearch

<code>@Test
public void test02() {
//\t\tBook book = new Book();
//\t\tbook.setId(1);
//\t\tbook.setBookName("西游记");
//\t\tbook.setAuthor("吴承恩");
//\t\tbookRepository.index(book);
// 测试是否通过findByBookNameLike的模糊查询找到西游记
for (Book book : bookRepository.findByBookNameLike("游")) {
System.out.println(book);
}

}/<code>
原创 | 一篇解决Springboot 整合 Elasticsearch

总结

本文通过两种方法实现对Springboot整合ElasticSearch

希望以上对你学习有用

再自我介绍一下吧。我叫润森,是一个的学习者。


分享到:


相關文章: