SpringBoot集成Elasticsearch7.4 实战(2)

elasticsearch

1. 数据管理

1.1. 新增数据

1.1.1. 单实例新增

http方式提交数据,案例中我将数据格式做了规范,提交过程中需要指定索引名,以及JSON格式数据,这样尽可能在实际过程中做到通用。

为此我用交互对象Vo来接受前端传递来的数据,再解析该Vo,获取要提交的目标索引。

  • 前端Web端实现

  

/**

 * @Description 新增数据

 * @param elasticDataVo

 * @return xyz.wongs.drunkard.base.message.response.ResponseResult

 * @throws

 * @date 2019/11/20 17:10

 */

@RequestMapping(value = "/add",method = RequestMethod.POST)

public ResponseResult add(@RequestBody ElasticDataVo elasticDataVo){

 ResponseResult response = getResponseResult();

 try {

 if(!StringUtils.isNotEmpty(elasticDataVo.getIdxName())){

 response.setCode(ResponseCode.PARAM_ERROR_CODE.getCode());

 response.setMsg("索引为空,不允许提交");

 response.setStatus(false);

 log.warn("索引为空");

 return response;

 }

 ElasticEntity elasticEntity = new ElasticEntity();

 elasticEntity.setId(elasticDataVo.getElasticEntity().getId());

 elasticEntity.setData(elasticDataVo.getElasticEntity().getData());

  

 baseElasticService.insertOrUpdateOne(elasticDataVo.getIdxName(), elasticEntity);

  

 } catch (Exception e) {

 response.setCode(ResponseCode.ERROR.getCode());

 response.setMsg("服务忙,请稍后再试");

 response.setStatus(false);

 log.error("插入数据异常,metadataVo={},异常信息={}", elasticDataVo.toString(),e.getMessage());

 }

 return response;

}

  • ElasticDataVo类

  

package xyz.wongs.drunkard.palant.vo;

  

import lombok.AllArgsConstructor;

import lombok.Data;

import lombok.NoArgsConstructor;

import xyz.wongs.drunkard.base.entiy.ElasticEntity;

  

/**

 * @ClassName ElasticDataVo

 * @Description http交互Vo对象

 * @author WCNGS@QQ.COM

 * @Github <a>https://github.com/rothschil</a>

 * @date 2019/11/21 9:10

 * @Version 1.0.0

*/

@Data

@NoArgsConstructor

@AllArgsConstructor

public class ElasticDataVo<T> {

  

 /**

 * 索引名

 */

 private String idxName;

 /**

 * 数据存储对象

 */

 private ElasticEntity elasticEntity;

  

}

  
  

  • ElasticEntity类

  

package xyz.wongs.drunkard.base.entiy;

  

import lombok.AllArgsConstructor;

import lombok.Data;

import lombok.NoArgsConstructor;

import xyz.wongs.drunkard.base.persistence.mybatis.entity.BaseEntity;

  

import java.util.Map;

  

/**

 * @ClassName ElasticEntity

 * @Description  数据存储对象

 * @author WCNGS@QQ.COM

 * @Github <a>https://github.com/rothschil</a>

 * @date 2019/11/21 9:10

 * @Version 1.0.0

*/

@Data

@AllArgsConstructor

@NoArgsConstructor

public class ElasticEntity<T> {

  

 /**

 * 主键标识,用户ES持久化

 */

 private String id;

  

 /**

 * JSON对象,实际存储数据

 */

 private Map data;

}

  

  • Postman提交

测试用例

1.1.2. 批量提交

1.2. 条件查询

为了通用,我在web端也分装了一层Vo,为了演示需要我仅写一个 match 精确匹配的查询。

  • 前端web实现

/**

 * @Description

 * @param queryVo 查询实体对象

 * @return xyz.wongs.drunkard.base.message.response.ResponseResult

 * @throws

 * @date 2019/11/21 9:31

 */

@RequestMapping(value = "/get",method = RequestMethod.GET)

public ResponseResult get(@RequestBody QueryVo queryVo){

  

 ResponseResult response = getResponseResult();

  

 if(!StringUtils.isNotEmpty(queryVo.getIdxName())){

 response.setCode(ResponseCode.PARAM_ERROR_CODE.getCode());

 response.setMsg("索引为空,不允许提交");

 response.setStatus(false);

 log.warn("索引为空");

 return response;

 }

  

 try {

 Class<?> clazz = ElasticUtil.getClazz(queryVo.getClassName());

 Map<String,Object> params = queryVo.getQuery().get("match");

 Set<String> keys = params.keySet();

 MatchQueryBuilder queryBuilders=null;

 for(String ke:keys){

 queryBuilders = QueryBuilders.matchQuery(ke, params.get(ke));

 }

 if(null!=queryBuilders){

 SearchSourceBuilder searchSourceBuilder = ElasticUtil.initSearchSourceBuilder(queryBuilders);

 List<?> data = baseElasticService.search(queryVo.getIdxName(),searchSourceBuilder,clazz);

 response.setData(data);

 }

 } catch (Exception e) {

 response.setCode(ResponseCode.ERROR.getCode());

 response.setMsg("服务忙,请稍后再试");

 response.setStatus(false);

 log.error("查询数据异常,metadataVo={},异常信息={}", queryVo.toString(),e.getMessage());

 }

 return response;

}

  

  • QueryVo

  

/** 查询Vo对象

 * @ClassName QueryVo

 * @Description

 * @author WCNGS@QQ.COM

 * @Github <a>https://github.com/rothschil</a>

 * @date 2019/10/25 23:16

 * @Version 1.0.0

*/

@Data

@NoArgsConstructor

@AllArgsConstructor

public class QueryVo {

  

 /**

 * 索引名

 */

 private String idxName;

 /**

 * 需要反射的实体类型,用于对查询结果的封装

 */

 private String className;

 /**

 * 具体条件

 */

 private Map<String,Map<String,Object>> query;

}

  

  • Postman提交

条件查询

1.3. 删除数据

1.3.1. 单实例删除


/**

 * @Description 删除

 * @param elasticDataVo

 * @return xyz.wongs.drunkard.base.message.response.ResponseResult

 * @throws

 * @date 2019/11/21 9:56

 */

@RequestMapping(value = "/delete",method = RequestMethod.POST)

public ResponseResult delete(@RequestBody ElasticDataVo elasticDataVo){

 ResponseResult response = getResponseResult();

 try {

 if(!StringUtils.isNotEmpty(elasticDataVo.getIdxName())){

 response.setCode(ResponseCode.PARAM_ERROR_CODE.getCode());

 response.setMsg("索引为空,不允许提交");

 response.setStatus(false);

 log.warn("索引为空");

 return response;

 }

 baseElasticService.deleteOne(elasticDataVo.getIdxName(),elasticDataVo.getElasticEntity());

 } catch (Exception e) {

 e.printStackTrace();

 }

 return response;

  

}

删除数据

1.3.2. 批量删除

2. 源码

Github演示源码 ,记得给Star

Gitee演示源码,记得给Star

3. 相关章节

一、SpringBoot集成Elasticsearch7.4 实战(一)

二、SpringBoot集成Elasticsearch7.4 实战(二)

三、SpringBoot集成Elasticsearch7.4 实战(三)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王老邪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值