极简教程 | Spring Boot整合Elasticsearch实现数据搜索引擎-阿里云开发者社区

开发者社区> 章为忠学架构> 正文

极简教程 | Spring Boot整合Elasticsearch实现数据搜索引擎

简介: 前面介绍了Elasticsearch的特点和优势,接下来在Spring Boot项目中使用Elasticsearch一步一步地实现搜索引擎的功能。
+关注继续查看
(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅998元/3年,立即抢购>>>:9i0i.cn/aliyun

福利推荐:阿里云、腾讯云、华为云等大品牌云产品全线2折优惠活动来袭,4核8G云服务器899元/3年,新老用户共享优惠,点击这里立即抢购>>>

前面介绍了Elasticsearch的特点和优势,接下来在Spring Boot项目中使用Elasticsearch一步一步地实现搜索引擎的功能。

一、Spring Boot对Elasticsearch的支持

在没有Spring Boot之前使用Elasticsearch非常痛苦,需要对Elasticsearch客户端进行一系列的封装等操作,使用复杂,配置烦琐。所幸,Spring Boot提供了对Spring Data Elasticsearch的封装组件
spring-boot-starter-data-elasticsearch,它让Spring Boot项目可以非常方便地去操作Elasticsearch中的数据。

值得注意的是,Elasticsearch的5.x、6.x、7.x版本之间的差别还是很大的。Spring Data Elasticsearch、Spring Boot与Elasticsearch之间有版本对应关系,不同的版本之间不兼容,Spring Boot 2.1对应的是Spring Data Elasticsearch 3.1.2版本。对应关系如表13-1所示。

表13-1 Spring Data Elasticsearch、Spring Boot与Elasticsearch的对应关系

Spring Data Elasticsearch

Spring Boot

Elasticsearch

3.2.x

2.2.x

6.8.4

3.1.x

2.1.x

6.2.2

3.0.x

2.0.x

5.5.0

2.1.x

1.5.x

2.4.0

这是官方提供的版本对应关系,建议按照官方的版本对应关系进行选择,以避免不必要的麻烦。


二、Spring Boot操作Elasticsearch的方式

由于Elasticsearch和Spring之间存在版本兼容的问题,导致在Spring Boot项目中操作Elasticsearch的方式有很多种,如Repositories、JestClient、Rest API等。因此有必要梳理一下主流的Spring Boot操作Elasticsearch的方式。目前,Spring推荐使用Elasticsearch的方式,如下图所示:

image.png

我们看到Spring Boot提供了ElasticSearchRepository和ElasticsearchRestTemplate实现索引数据的增删改查。

  • ElasticSearchRepository:继承自Spring Data中的Repository接口,所以支持以数据库的方式对数据进行增删改查的操作,而且支持已命名查询等数据查询。
  • ElasticsearchRestTemplate:spring-data-Elasticsearch项目中的一个类,和其他Spring项目中的Template类似。ElasticsearchRestTemplate是Spring对ES的Rest API进行的封装,提供了大量相关的类来完成复杂的查询功能。


三、在Spring Boot项目中集成Elasticsearch

Spring Boot提供的spring-boot-starter-data-Elasticsearch组件为我们提供了非常便捷的数据检索功能。下面就来演示Spring Boot项目如何集成Elasticsearch。

1. 添加Elasticsearch依赖

首先在pom.xml中添加spring-boot-starter-data-Elasticsearch组件依赖,代码如下:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-Elasticsearch</artifactId>
</dependency>

2. 配置Elasticsearch

在application.properties项目配置文件中添加Elasticsearch服务器的地址,代码如下:

spring.Elasticsearch.rest.uris=http://10.2.1.231:9200

主要用来配置Elasticsearch服务地址,多个地址用逗号分隔。需要注意的是,Spring Data Elasticsearch各版本的配置属性可能不一样。本示例中使用的是7.6.2版本。

3. 创建文档对象

创建实体对象类Book,然后使用@Document注解定义文档对象,示例代码如下:

@Document( indexName = "book" , replicas = 0)
public class Book {
    @Id
    private Long id;
    
    @Field(analyzer = "ik_max_word",type = FieldType.Text)
    private String bookName;
    
    @Field(type = FieldType.Keyword)
    private String author;
    
    private float price;
    
    private int page;
    
    @Field(type = FieldType.Keyword, fielddata = true)
    private String category;
    
    // 省略get、set方法
    
    public Book(){
    
    }
    
    public Book(Long id,String bookName, String author,float price,int page,String category) {
    
        this.id = id;
        this.bookName = bookName;
        this.author = author;
        this.price = price;
        this.page = page;
        this.category = category;
    }
    
    @Override
    public String toString() {
    
        final StringBuilder sb = new StringBuilder( "{\"Book\":{" );
            sb.append( "\"id\":" ).append( id );
            sb.append( ",\"bookName\":\"" ).append( bookName ).append( '\"' );
            sb.append( ",\"page\":\"" ).append( page ).append( '\"' );
            sb.append( ",\"price\":\"" ).append( price ).append( '\"' );
            sb.append( ",\"category\":\"" ).append( category ).append( '\"' );
            sb.append( ",\"author\":\"" ).append( author ).append( '\"' );
            sb.append( "}}" );
            
        return sb.toString();
    
    }
}

如上面的示例所示,通过@Document注解将数据实体对象与Elasticsearch中的文档和属性一一对应。

(1)@Document注解会对实体中的所有属性建立索引:

  • indexName = "customer":表示创建一个名为customer的索引。
  • type="customer":表示在索引中创建一个名为customer的类别,而在Elasticsearch 7.x版本中取消了类别的概念。
  • shards = 1:表示只使用一个分片,默认为5。
  • replicas = 0:表示副本数量,默认为1,0表示不使用副本。
  • refreshInterval = "-1":表示禁止索引刷新。

(2)@Id作用在成员变量,标记一个字段作为id主键。

(3)@Field作用在成员变量,标记为文档的字段,并指定字段映射属性:

  • type:字段类型,取值是枚举:FieldType。
  • index:是否索引,布尔类型,默认是true。
  • store:是否存储,布尔类型,默认是false。
  • analyzer:分词器名称是ik_max_word。


4. 创建操作的Repository

创建CustomerRepository接口并继承ElasticsearchRepository,新增两个简单的自定义查询方法。示例代码如下:

public interface BookRepository extends ElasticsearchRepository<Book, Integer>{
        List<Book> findByBookNameLike(String bookName);
}

通过上面的示例代码,我们发现其使用方式和JPA的语法是一样的。


5. 验证测试

首先创建BookRepositoryTest单元测试类,在类中注入BookRepository,最后添加一个数据插入测试方法。

@Test
public void testSave() {
Book book = new Book();
book.setId(1);
book.setBookName("西游记");
book.setAuthor("吴承恩");
repository.save(book);
Book newbook=repository.findById(1).orElse(null);
System.out.println(newbook);
}

单击Run Test或在方法上右击,选择Run 'testSave',运行单元测试方法,查看索引数据是否插入成功,运行结果如下图所示:

image.png

结果表明索引数据保存成功,并且通过id能查询到保存的索引数据信息,说明在Spring Boot中成功集成Elasticsearch。


最后

以上,介绍了Spring Boot项目中使用Elasticsearch,一步一步地实现搜索引擎的功能。



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云宣布图像搜索商业化,百亿级海量数据检索能力颠覆多媒体搜索领域
7月18日,阿里云宣布图像搜索正式商业化,这是一款以深度学习和大规模机器学习技术为核心,通过图像识别和搜索功能,实现以图搜图的智能图像搜索产品,基于图像识别技术基础上,结合不同行业应用和业务场景,帮助用户实现相同或相似图片搜索。
2055 0
数据结构之树、森林和二叉树的转换
树转换为二叉树 (1)加线。在所有兄弟结点之间加一条连线。 (2)去线。树中的每个结点,只保留它与第一个孩子结点的连线,删除它与其它孩子结点之间的连线。
726 0
分享录制的正则表达式入门、高阶以及使用 .NET 实现网络爬虫视频教程
我发布的「正则表达式入门以及高阶教程」,欢迎学习。 课程简介 正则表达式是软件开发必须掌握的一门语言,掌握后才能很好地理解到它的威力; 课程采用概念和实验操作 4/6 分隔,帮助大家理解概念后再使用大量的实例加深对概念的理解; 实例操作是对概念最好的理解,也是学习新语言最有效的办法; 在课程中也穿插着大量软件开发的技巧和大家分享; 应该是把晦涩的正则表达式讲解的最生动的课程; 掌握了正则表达式后,您一定会觉得这是一门最值得掌握的语言。
887 0
干货 | 论Elasticsearch数据建模的重要性
1、什么是数据模型? 数据模型是抽象描述现实世界的一种工具和方法,是通过抽象的实体及实体之间联系的形式,用图形化的形式去描述业务规则的过程,从而表示现实世界中事务的相互关系的一种映射。
9 0
图解Elasticsearch之一——索引创建过程
引言 这是国外培训ppt课程的节选内容。 以下是我们的Core Elasticsearch:Operations课程中的一些很棒的幻灯片,它们有助于解释分片分配的概念。 我们建议您更全面地了解这一点,但我会在此提供我们培训的概述: 分片分配是将分片分配给节点的过程。 这可能发生在初始恢复,副本分配,重新平衡或添加或删除节点期间。 大多数时候,你不需要考虑它,这项工作是由Elasticsearch在后台完成的。 如果您发现自己对这些细节感到好奇,本文将探讨在几种不同情况下的分片分配。 由于是图解,为方便阅读,我分了4篇文章逐一呈现。
11 0
企业级搜索公司PureDiscovery获C轮融资1000万美元
? 企业级搜索公司PureDiscovery不是依赖索引和关键词搜索,它专注于语义分析技术、学习公司文件内容中所指的内涵——通过创造一个语义大脑( semantic brain)指示用户需要的数据。
958 0
突破Java面试(15)-分布式搜索引擎Elastic Search的工作流程
面试官就是想看看你是否了解ES的一些基本原理. ES无非就是写/查数据,你如果不明白你发起写入/搜索请求后,ES做了什么,那你该劝退了.
2528 0
SpringCloud+Vue微服务教程与实战(1)--全新的开始
本文目录 1. 背景 2. 微服务架构的优缺点 3. 实现技术 4. 开发环境 5. 小结
7 0
+关注
章为忠学架构
获取源码、资料,请关注我的微信公众号(架构师精进)
68
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载


http://www.vxiaotou.com