一篇解决Springboot 整合 Elasticsearch
Posted 狂奔的蜗牛Evan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一篇解决Springboot 整合 Elasticsearch相关的知识,希望对你有一定的参考价值。
ElasticSearch
结合业务的场景,在目前的商品体系需要构建搜索服务,主要是为了提供用户更丰富的检索场景以及高速,实时及性能稳定的搜索服务。
ElasticSearch
是一个基于Lucene
的搜索服务器,其实就是对Lucene
进行封装,提供了REST
API 的操作接口。
ElasticSearch
作为一个高度可拓展的开源全文搜索和分析引擎,可用于快速地对大数据进行存储,搜索和分析。
ElasticSearch
主要特点:分布式、高可用、异步写入、多API、面向文档 。
ElasticSearch
核心概念:近实时,集群,节点(保存数据),索引,分片(将索引分片),副本(分片可设置多个副本) 。它可以快速地储存、搜索和分析海量数据。
Docker搭建 Elasticsearch
安装Elasticsearch的Docker镜像
目前Elasticsearch 版本到了7.X, Springboot 目前不支持7.X以上的elasticsearch。所以还是选择了稳定的2.4.6
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
访问服务器的9200端口,测试是否成功搭建Elasticsearch
springboot搭建 Elasticsearch工程
选择NOSQL中的 Elasticsearch
依赖
pom.xml项目配置依赖
<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>
SpringBoot默认支持两种技术来和ES交互
- Jest(默认不生效)
需要导入jest的工具包(io.searchbox.client.JestClient)
- 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
记得在pom文件中引入jest,先注释掉ElasticSearch的依赖:
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-data-elasticsearch</artifactId>-->
<!-- </dependency>-->
<!-- https://mvnrepository.com/artifact/io.searchbox/jest -->
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>2.4.0</version>
</dependency>
Jest
使用默认配置JestAutoConfiguration
,而JestAutoConfiguration
注入一个JestClient
,要使用这个客户端,要先在配置文件中指定es的地址:
application.properties配置文件
spring.elasticsearch.jest.uris=http://ip:9200
跑起来看看是否连接成功
Jest实战演练
创建bean.Article
类,私有变量id
, author
,title
,content
,补充Getter和Setter
@JestId
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;
ElasticsearchApplicationTests
测试类中
@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();
运行测试,访问http://ip:9200/atguigu/news/1
测试搜索
@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();
更多操作:https://github.com/searchbox-io/Jest/tree/master/jest
测试运行
运行如下
SpringData ElasticSearch
还有一个SpringData ElasticSearch
pom文件打开SpringData ElasticSearch
依赖
注意Elasticsearch
和spring-boot-starter-data-elasticsearch
版本对应
新新版本的SpringBoot 2
的spring-boot-starter-data-elasticsearch
中支持的Elasticsearch
版本是2.X, 但Elasticsearch
实际上已经发展到6.5.X版本了,为了更好的使用Elasticsearch
的新特性, 所以弃用了spring-boot-starter-data-elasticsearch
依赖,而改为直接使用Spring-data-elasticsearch
Docker安装Elasticsearch镜像6.X,和上面一样
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
访问测试OK
docker-cluster
这里创建一个容器变了
application.properties配置文件
spring.data.elasticsearch.cluster-name=docker-cluster
spring.data.elasticsearch.cluster-nodes=ip:9301
跑起来测试下
SpringData ElasticSearch就是编写一个ElasticsearchRepository
的子接口来操作ES
SpringData ElasticSearch实战演练
新建bean.Book类,三个类变量,补充Getter
和Setter
ElasticSearch是面对文档的
@Document(indexName = "atguigu", type = "book")
补充文档:index序列和type
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 + '\\'' +
'';
编写repository.BookRepository接口继承ElasticsearchRepository
接口
同时重写findByBookNameLike`方法
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;
/**
* @author: 毛利
*/
public interface BookRepository extends ElasticsearchRepository<Book, Integer>
public List<Book> findByBookNameLike(String bookName);
测试类
@Autowired
BookRepository bookRepository;
@Test
public void test02()
Book book = new Book();
book.setId(1);
book.setBookName("西游记");
book.setAuthor("吴承恩");
bookRepository.index(book);
运行测试类后,访问是否找到book1
@Test
public void test02()
// Book book = new Book();
// book.setId(1);
// book.setBookName("西游记");
// book.setAuthor("吴承恩");
// bookRepository.index(book);
// 测试是否通过findByBookNameLike的模糊查询找到西游记
for (Book book : bookRepository.findByBookNameLike("游"))
System.out.println(book);
总结
本文通过两种方法实现对Springboot
整合ElasticSearch
原文地址:https://cloud.tencent.com/developer/article/1573013
以上是关于一篇解决Springboot 整合 Elasticsearch的主要内容,如果未能解决你的问题,请参考以下文章