Elasticsearch 实战 - 第五讲:Java 集成 Spring Data Elasticsearch(一):简介及环境搭建

Elasticsearch 实战系列文章:

1:Elasticsearch 实战 - 第一讲:简介以及安装
2:Elasticsearch 实战 - 第二讲:kibana 安装以及ES 的概念名词
3:Elasticsearch 实战 - 第三讲:ES 基本操作、批处理
4:Elasticsearch 实战 - 第四讲:ES 高级查询
5:Elasticsearch 实战 - 第五讲:Java 集成 Spring Data Elasticsearch(一):简介及环境搭建
6:Elasticsearch 实战 - 第六讲:ES 项目实战(二):基本操作、批处理、高级查询

导读:本实例为博主原创,属于简单易上手并且能够拿来就用的SpringBoot ES 项目,全文使用的是ElasticsearchTemplate进行开发。 本实例涵盖ES中的各类操作,如索引操作、CRUD操作、批处理、结果排序、分页查询、检索查询、关键字查询、高亮显示、逻辑查询、过滤查询、分组查询等等。如有不对之处欢迎在博客中留言交流。谢谢!!!(本文👆上部有完整的实例代码)

一:前语

1、项目文档 CSDN 专栏:《Elasticsearch 入门和项目实战》

博客路径: https://blog.csdn.net/a767815662/category_9190277.html

2、项目GitHub 地址:

https://github.com/17666555910/SpringBoot-Elasticsearch-Demo

3、项目结构介绍​

--- com.xinghua.elasticsearchservice
    | --- common       基础依赖
       | --- dto       展示层
       | --- model     基础实体类
       | --- utils     基础工具包
       | --- service   基础业务包(通用CRUD,批量操作接口)
          | --- impl   基础业务实现层(通用CRUD,批量操作实现)
    | --- constans     常量包
    | --- controller   视图层
    | --- model        实体
    | --- service      业务层
       | --- impl      业务实现层  
    | --- utils        工具包  

4、已实现的ES功能

--- IBaseService
    | --- getIndexName():               获取ES索引名称
    | --- getIndexType():               获取ES索引类型
    | --- getEntityClass():             返回泛型上的Class对象
    | --- init(List<T> entityList):     初始化数据
    | --- createEntityEsIndex():        创建索引和映射
    | --- saveOrUpdate(T entityModel):  新增或修改
    | --- delete(String id):            删除entity
    | --- deleteIndex():                删除索引
    | --- batchInsertOrUpdate(List<T> entityModelList):批量新增/更新
    
以下是高级查询相关的接口
    | --- getPageRequest(int pageNumber, int pageSize):获取PageRequest对象
    | --- searchPage(NativeSearchQueryBuilder nativeSearchQueryBuilder, int pageNumber, int pageSize):分页查询
    | --- searchPageBySort(List<SortDTO> sortDTOList, NativeSearchQueryBuilder nativeSearchQueryBuilder, int pageNumber, int pageSize):分页查询 按照指定字段排序,多个字段按照先后顺序排序
    | --- searchList(NativeSearchQueryBuilder nativeSearchQueryBuilder):查询操作
    | --- searchListBySort(List<SortDTO> sortDTOList, NativeSearchQueryBuilder nativeSearchQueryBuilder):查询操作-按照指定字段排序,多个字段按照先后顺序排序
    | --- query(NativeSearchQueryBuilder nativeSearchQueryBuilder):用于分组查询

5、实例测试类

--- BaseProductEsTest:基础功能测试类
--- ProductEsTest:各种高级查询功能测试类

二:项目部署

1、Spring Data Elasticsearch 简介

Spring Data Elasticsearch是Spring Data项目下的一个子模块。
查看 Spring Data的官网:http://projects.spring.io/spring-data/
Spring Data 的使命是给各种数据访问提供统一的编程接口,不管是关系型数据库(如MySQL),还是非关系数据库(如Redis),或者类似Elasticsearch这样的索引数据库。从而简化开发人员的代码,提高开发效率。

本文主要参考官方文档
https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/
https://spring.io/projects/spring-data-elasticsearch

2、导入依赖

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

3、 配置连接信息

#application.properties 
# 配置集群名称,名称写错会连不上服务器,默认elasticsearch 
spring.data.elasticsearch.cluster-name=elasticsearch 
# 配置集群节点 
spring.data.elasticsearch.cluster-nodes=localhost:9300

4、组件介绍

  • ElasticsearchTemplate:框架封装的用于便捷操作Elasticsearch的模板类
  • ElasticsearchRepository:框架封装的用于便捷完成常用操作的工具接口
  • NativeSearchQueryBuilder:用于生成查询条件的构建器,需要去封装各种查询条件
  • QueryBuilder:该接口表示一个查询条件,其对象可以通过QueryBuilders工具类中的方法快速生成各种条件
    • boolQuery():生成bool条件,相当于 “bool”: { }
    • matchQuery():生成match条件,相当于 “match”: { }
    • rangeQuery():生成range条件,相当于 “range”: { }
  • AbstractAggregationBuilder:用于生成分组查询的构建器,其对象通过AggregationBuilders工具类生成
  • Pageable:表示分页参数,对象通过PageRequest.of(页数, 容量)获取
  • SortBuilder:排序构建器,对象通过SortBuilders.fieldSort(字段).order(规则)获取

5、ElasticsearchTemplate 类

该模板类,封装了便捷操作Elasticsearch的模板方法,包括 索引 / 映射 / CRUD 等底层操作和高级操作,该对象用起来会略微复杂些,尤其是对于查询,还需要把查询到的结果自己封装对象。

//该对象已经由SpringBoot完成自动配置,直接注入即可
@Autowired private ElasticsearchTemplate template;

6、ElasticsearchRepository 类

该接口是框架封装的用于操作Elastsearch的高级接口,只要我们自己的写个接口去继承该接口就能直接对Elasticsearch进行CRUD操作。

/**
   *  泛型1:domain的类型 
   *  泛型2:文档主键类型 该接口直接该给Spring,底层会使用JDK代理的方式创建对象,交给容器管理
 */ 
@Repository 
public interface ProductESRepository extends ElasticsearchRepository<User, Long> { 
	// 符合Spring Data规范的高级查询方法 
}

一般情况下,ElasticsearchTemplate和ElasticsearchRepository是分工合作的,ElasticsearchRepository已经能完成绝大部分的功能,如果遇到复杂的查询则要使用ElasticsearchTemplate,如多字段分组、高亮显示等。

7、编写domain(实体类)

基类:

package com.xinghua.elasticsearchservice.common.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;

/**
 * @Description 基础实体类
 * @Author 姚广星
 * @Date 2020/2/28 21:18
 **/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class EntityEsModel {
    @Id
    private String id;
}

业务类:

package com.xinghua.elasticsearchservice.model;

import com.xinghua.elasticsearchservice.common.model.EntityEsModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

/**
 * @Description ES 实体类
 * Document:配置操作哪个索引下的哪个类型
 * Id:标记文档ID字段
 * Field:配置映射信息,如:分词器
 * @Author 姚广星
 * @Date 2020/2/24 16:13
 **/

@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "商品ES对象")
@Document(indexName = "product", type = "product")
public class ProductEsModel extends EntityEsModel {

    /**
     * 名称
     */
    @ApiModelProperty(value = "名称")
    @Field(analyzer = "ik_max_word", searchAnalyzer = "ik_max_word", type = FieldType.Text)
    private String title;

    /**
     * 价格
     */
    @ApiModelProperty(value = "价格")
    private Double price;

    /**
     * 产地
     */
    @ApiModelProperty(value = "产地")
    @Field(analyzer = "ik_max_word", searchAnalyzer = "ik_max_word", type = FieldType.Text)
    private String origin;

    /**
     * 品牌ID
     */
    @ApiModelProperty(value = "品牌ID")
    @Field(type = FieldType.Keyword)
    private String brandId;

    /**
     * 品牌名称
     */
    @ApiModelProperty(value = "品牌名称")
    @Field(type = FieldType.Keyword)
    private String brandName;

    /**
     * 关键字
     */
    @ApiModelProperty(value = "关键字")
    @Field(analyzer = "ik_max_word", searchAnalyzer = "ik_max_word", type = FieldType.Text)
    private String keyword;

    public ProductEsModel(String id, String title, Double price, String origin, String brandId, String brandName, String keyword) {
        super(id);
        this.title = title;
        this.price = price;
        this.origin = origin;
        this.brandId = brandId;
        this.brandName = brandName;
        this.keyword = keyword;
    }

    @Override
    public String toString() {
        return "ProductEsModel{" +
                "title='" + title + '\'' +
                ", id=" + super.getId() +
                ", price=" + price +
                ", origin='" + origin + '\'' +
                ", brandId='" + brandId + '\'' +
                ", brandName='" + brandName + '\'' +
                ", keyword='" + keyword + '\'' +
                '}';
    }
}

更多资讯请扫描以下二维码或关注微信公号“愿为最亮星”,为您提供更深层次的解答。
在这里插入图片描述

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华星详谈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值