Elasticsearch 实战 - 第五讲:ES 项目实战(一):简介及环境搭建
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 + '\'' +
'}';
}
}
更多资讯请扫描以下二维码或关注微信公号“愿为最亮星”,为您提供更深层次的解答。