1 简介
- 我们的应用经常需要添加检索功能,开源的ElasticSearch是目前全文搜索引擎的首选。它可以快速的存储、搜索和分析海量数据。SpringBoot通过整合Spring Data ElasticSearch为我们提供了非常便捷的检索功能的支持。
- ElasticSearch是一个分布式搜索功能,提供Restful API,底层基于Lucene,采用多shard(分片)的方式保证数据安全,并且提供自动resharding的功能,github等大型的站点也是采用ElasticSearch作为其搜索服务。
2 概念
2.1 概念
- 以员工文档的形式存储为例:一个文档代表一个员工数据。存储数据到ElasticSearch的行为叫做索引,但是在索引一个文档之前,需要确定将文档存储在哪里。
- 一个ElasticSeach集群可以包含多个索引,相应的每个索引可以包含多个类型。这些不同的类型存储着多个文档,每个文档有多个属性。
- 类似关系:
- 索引—数据库。
- 类型—表。
- 文档—表中记录。
- 属性—列。

2.2 应用示例(摘自官网)
- 对于员工目录,我们将做如下操作:
每个员工索引一个文档,文档包含该员工的所有信息。
每个文档都将是
employee类型 。该类型位于 索引
megacorp内。该索引保存在我们的 Elasticsearch 集群中。
- 实践中这非常简单(尽管看起来有很多步骤),我们可以通过一条命令完成所有这些动作:
PUT /megacorp/employee/1{"first_name" : "John","last_name" : "Smith","age" : 25,"about" : "I love to go rock climbing","interests": [ "sports", "music" ]}
- 注意,路径
/megacorp/employee/1包含了三部分的信息: megacorp:索引名称。employee:类型名称。1:特定雇员的ID。

3 SpringBoot整合ElasticSearch
3.1 Docker安装ElasticSearch
docker run -d --name elasticsearch -p 9200:9200 \-p 9300:9300 \-e "discovery.type=single-node" \-e ES_JAVA_OPTS="-Xms256m -Xmx256m" \-d elasticsearch:7.7.0
3.2 搭建环境
SpringBoot的版本是2.3.4.RELEASE,ES的版本是7.7.0。
- 导入相关jar包的Maven坐标:
<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>
- application.yml
spring:elasticsearch:rest:uris: http://192.168.237.100:9200
3.3 编写实体类
- Article.java:
package com.sunxiaping.springboot.domain;import org.springframework.data.annotation.Id;import org.springframework.data.elasticsearch.annotations.Document;import java.io.Serializable;@Document(indexName = "es",type = "_article")public class Article implements Serializable {@Idprivate 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;}@Overridepublic String toString() {return "Article{" +"id=" + id +", author='" + author + '\'' +", title='" + title + '\'' +", content='" + content + '\'' +'}';}}
3.4 编写持久层接口
- 编写ArticleRepository接口:
package com.sunxiaping.springboot.repository;import com.sunxiaping.springboot.domain.Article;import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;public interface ArticleRepository extends ElasticsearchRepository<Article,Integer> {}
3.5 测试
package com.sunxiaping.springboot;import com.sunxiaping.springboot.domain.Article;import com.sunxiaping.springboot.repository.ArticleRepository;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import java.util.Optional;@SpringBootTest@RunWith(SpringRunner.class)public class SpringbootApplicationTests {@Autowiredprivate ArticleRepository articleRepository;@Testpublic void test(){Article article = new Article();article.setId(1);article.setTitle("震惊了,ES竟然可以这么用");article.setAuthor("UC编辑部");article.setContent("********震惊了,ES竟然可以这么用*********");articleRepository.save(article);}@Testpublic void test2(){Optional<Article> optional = articleRepository.findById(1);optional.ifPresent(article->{System.out.println("article = " + article);});}}
