原本项目是基于MYSQL的,现因需求将其转换为MYSQL+Elasticsearch,MYSQL的ORM使用的是Spring Data Jpa,Mybatis的转换与其类似,有人看再更

先看原项目

原项目的DAO层

@Repository
public interface UserRepository extends JpaRepository<User, Long> {Optional<User> findOneByActivationKey(String activationKey);List<User> findAllByActivatedIsFalseAndCreatedDateBefore(Instant dateTime);Optional<User> findOneByResetKey(String resetKey);Optional<User> findOneByEmailIgnoreCase(String email);Optional<User> findOneByLogin(String login);@EntityGraph(attributePaths = "authorities")Optional<User> findOneWithAuthoritiesById(Long id);@EntityGraph(attributePaths = "authorities")Optional<User> findOneWithAuthoritiesByLogin(String login);@EntityGraph(attributePaths = "authorities")Optional<User> findOneWithAuthoritiesByEmail(String email);Page<User> findAllByLoginNot(Pageable pageable, String login);
}

原项目的DTO

1.User.java

@Entity
@Table(name = "user")
public class User implements Serializable {private static final long serialVersionUID = 1L;@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@NotNull@Pattern(regexp = Constants.LOGIN_REGEX)@Size(min = 1, max = 50)@Column(length = 50, unique = true, nullable = false)private String login;@JsonIgnore@NotNull@Size(min = 60, max = 60)@Column(name = "password_hash", length = 60, nullable = false)private String password;@Email@Size(min = 5, max = 254)@Column(length = 254, unique = true)private String email;@NotNull@Column(nullable = false)private boolean activated = false;@Column(name = "reset_date")private Instant resetDate = null;@JsonIgnore@ManyToMany@JoinTable(name = "jhi_user_authority",joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},inverseJoinColumns = {@JoinColumn(name = "authority_name", referencedColumnName = "name")})@BatchSize(size = 20)private Set<Authority> authorities = new HashSet<>();//...
}

2.Authority.java

@Entity
@Table(name = "jhi_authority")
public class Authority implements Serializable {private static final long serialVersionUID = 1L;@NotNull@Size(max = 50)@Id@Column(length = 50)private String name;
}

可以看出原项目使用Spring data + hibernate 作为ORM,规范的使用其格式进行自动生成SQL语句


接下来就是转换成elasticsearch的时候了

这里我不采用elasticsearch官网的client依赖包而是spring-data-elasticsearch,原因如下:

  1. 官网提供的low包就是一个httpclient,做业务操作时需要自己编写json,几百个接口就要编写几百次json,过于麻烦
  2. 官网提供的high包必须要与elasticsearch对应版本才行,不然项目就运行不起来
  3. 原项目是使用Spring-data-jpa的,这里用spring-data-elasticsearch在更改时会方便很多

首先先配置elasticsearch

pom.xml加入

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

若你是spring boot项目,则在 application.yml 或者 application.properties 加入

spring:    data:elasticsearch:cluster-nodes: localhost:9300

若你是普通spring项目则看

Spring Data Elasticsearch​docs.spring.io

进行配置

改造DTO

把原有的spring data 注解删除掉

然后替换成elasticsearch的注解

@Document(indexName = "user", type = "doc")
public class User {//这里的instant jackson无法直接从string转换为instant,需要编写个编解码类@JsonSerialize(using = InstantJacksonSerializer.class)@JsonDeserialize(using = InstantJacksonDeserialize.class)private Instant createdDate;private String createdBy;private boolean activated;//原项目Id,是使用Long类型,这里不改,但elasticsearch的话推荐使用String作为Id,因为自动创建id的时候为随机字符串@Idprivate Long id;private Set<Authority> authorities;private String login;private String email;//...
}

可以看到,我除了删除了原项目的注解外,DTO就只有添加了 @Document(indexName = user", type = "doc") ,Instant是原项目使用的,如果是用Date的话则使用 @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")

改造DAO层

先看改造后的

public interface UserRepository extends ElasticsearchRepository<User, Long> {Optional<User> findOneByActivationKey(String activationKey);List<User> findAllByActivatedIsFalseAndCreatedDateBefore(Instant dateTime);Optional<User> findOneByResetKey(String resetKey);Optional<User> findOneByEmailIgnoreCase(String email);Optional<User> findOneByLogin(String login);Optional<User> findOneByEmail(String email);Page<User> findAllByLoginNot(Pageable pageable, String login);}

将UserRepository 改为继承ElasticsearchRepository<User, Long> ,其中第一个参数为DTO,第二个参数为Id,把连表的with给去掉即可(IDEA中用shift+F6可以很方便的),若你需要特殊查询,可以使用

        @Query("{"bool" : {"must" : {"field" : {"name" : "?0"}}}}")Page<Book> findByName(String name,Pageable pageable);

关于join的问题

Elasticsearch是不支持join操作的,可以有以下几种解决方案

  1. 因SQL不支持数组才把其放入其他表的,Elasticsearch本身支持数组,直接放入同一张表
  2. 一对多,一对一,多对一情况下的,可以考虑数据冗余,直接加入同一张表中,Elasticsearch本身储存的数据会进行压缩的,数据冗余可以接受,在不加索引情况下可能达到MYSQL十分之一的存储空间
  3. 使用父子关系(不推荐,之前看到好像在将来的版本会被废弃?)
  4. 两次查询解决join问题(实在没办法了就只能这样做了)

在本项目中我用的是方案一,再复杂点的情况之后再考虑

⑤关于遇到的坑

    //MYSQL@Size(max = 50)@Column(name = "first_name", length = 50)private String firstName;//Elasticsearchprivate String firstName;

MYSQL数据库里储存的字段名都是first_name这样以下划线作为分词的,而spring data Elasticsearch 我并没有找到转义的相应注解。。。。如果有人知道麻烦告诉下

我的解决方案:

在导入数据源的时候,把其改为驼峰法的结构

数据导入

我使用的是logstash,还有其他框架可以使用,按需求自己决定吧

spring elasticsearch 按条件删除_实战:项目数据源转为Elasticsearch相关推荐

  1. spring elasticsearch 按条件删除_SpringBoot2 高级案例(08):整合 ElasticSearch框架,实现高性能搜索引擎...

    一.安装和简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的, ...

  2. python爬上市公司信息_实战项目 1:5 行代码爬取国内所有上市公司信息

    实战项目 1:5 行代码爬取国内所有上市公司信息 Python入门爬虫与数据分析 在正式开始这门专栏课的学习之前,我们先来看一个简单的爬虫案例.兴趣是最好的老师,当你对爬虫产生兴趣的时候,才会更有动力 ...

  3. python 播放本地音乐_实战项目—python实现本地音乐播放器

    随着网络的发展,我们已经很少将音乐下载到本地,而是直接在线听歌,方便而又直接.也许你用的音乐播放器是这个 也许是这个 这都不是重点,今天我们要用python自己打造一款音乐播放器. 具体思路 使用py ...

  4. spring elasticsearch 按条件删除_Elasticsearch系列之Query DSL

    1 前言 我们先通过阅读官方文档,了解一下什么是 Query DSL . 1.1 Query DSL Elasticsearch provides a full Query DSL (Domain S ...

  5. 全连接条件随机场_【项目案例】北京大兴机场BIM技术应用

    BIM学者  I  一个专业的BIM圈子 北京大兴国际机场地跨北京市大兴区和河北省廊坊市,从高空俯瞰,北京大兴国际机场宛若展翅的凤凰.到2040年,将共达到7条跑道,占地68平方公里,年货邮量为400 ...

  6. 实现根据条件删除_常见数据结构的实现(一):跳跃表

    知乎的小伙伴们好,这是我在知乎写的第一篇文章哈.我写这篇文章的目的主要是和大家分享一些想法,交流学习一下. 这系列的文章是分析常见数据结构的实现,包括跳跃表.二叉堆.前缀树.红黑树等等...数据结构这 ...

  7. 实现根据条件删除_强大的定位空值法,1秒删除所有不想要的数据

    私信回复关键词[CSV],获取CSV工具,帮你批量转换上百个Excel文件格式! 前几天在微信后台看到这样一个问题: 这个表格里,每隔一分钟就有一条温度与湿度等数据的记录. 但我只想每隔五分钟留下一条 ...

  8. python分析比赛_实战项目练习 ---- 【2018世界杯】用python分析夺冠球队

    2018世界杯 前言 在网上找到了个用Python分析2018世界杯夺冠热门的项目,感觉很有意思准备拿来练练手. 因为目前还没有学到图形可视化部分,所以这部分内容会完全借鉴网上的教程. 分析目的 通过 ...

  9. mysql主从架构升级_实战项目——mysql主从架构的实现

    一主一从 1.1 环境准备: centos系统服务器2台. 一台用户做Mysql主服务器, 一台用于做Mysql从服务器, 配置好yum源. 防火墙关闭. 各节点时钟服务同步. 各节点之间可以通过主机 ...

最新文章

  1. P5667 拉格朗日插值2(拉格朗日插值,NTT, 倒推求逆元)
  2. 安装了mysql5.7后,如何进行配置(密码等)初始化
  3. 北京智源人工智能研究院关于征集2019年度智源青年科学家的通知
  4. Android一个完整的项目转成SDK提供给第三方嵌入
  5. ylb:表的结构的修改和基本约束
  6. Apache错误日志提示AH02004: SSL Proxy: Peer certificate is expired
  7. python书籍推荐1001python书籍推荐_Python的1001种骚操作——基础篇(0)
  8. 出现次数最多的整数-蓝桥杯算法训练
  9. 如果知道它们的热量,还想点吗?
  10. 学习笔记 : 表达式目录树相关问题参照该demo expression拼接与拆解 expression转sql...
  11. 【JDK和Open JDK】平常使用的JDK和Open JDK有什么区别(转)
  12. hive中的集合操作函数
  13. 浅谈企业信息化规划建设
  14. pygame画圆练习赤橙黄绿青蓝紫
  15. manage run-time environment
  16. GIS-空间分析(4)
  17. 不再犹豫用计算机,电脑固态硬盘接口该怎么选?3选1不再犹豫
  18. 如何优雅的使用C语言绘制一只小猪佩奇
  19. ini文件全部写入时换行符号未写入的问题处理
  20. 22.9.24 比赛

热门文章

  1. 基于阿里云物联网平台,我们这样实现简易出入监控
  2. 看完这些干货帖,大数据产品从入门到精通
  3. 黑科技揭秘:网红“天空物联网飞艇”服务范围为何能突破30公里
  4. 服务化改造实践(二)| Dubbo + Kubernetes
  5. EDAS再升级!全面支持Spring Cloud应用
  6. 【 CDN 最佳实践】CDN 命中率优化思路
  7. 2020 AI 产业图谱启动,勾勒中国 AI 技术与行业生态
  8. js组装知识(待续……)
  9. 如何把极坐标化为直角坐标_2019高考100题之063(极坐标)
  10. mysql批量插入 增加参数_MySql 的批量操作,要加rewriteBatchedStatements参数