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

原本项目是基于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,还有其他框架可以使用,按需求自己决定吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android接口类命名规范_超全面的UI基础设计规范来啦,还不收藏 ~

写在前面的话 很多刚入行的UI设计师开始接触移动端UI设计的时候&#xff0c;对于基础的界面尺寸规范可能会有一定的模糊认知&#xff0c;导致做出来的界面往往会感觉不是那么和谐&#xff0c;却也不知道怎么去完善和改进。对于大多数的刚入行者来说&#xff0c;如果不是有天赋…

mysql按升序创建索引_MySQL 降序索引

MySQL 降序索引简介&#xff1a;在本教程中&#xff0c;您将了解MySQL降序索引以及如何利用它来提高查询性能。MySQL降序索引简介降序索引是以降序存储键值的索引。在MySQL 8.0之前&#xff0c;您可以DESC在索引定义中指定。但是&#xff0c;MySQL忽略了它。与此同时&#xff0…

python开源项目新手_10大Python开源项目推荐(Github平均star2135)

翻译 | suisui出品 | AI科技大本营(公众号ID&#xff1a;rgznai100)继续假日充电系列~本文是 Mybridge 挑选的 10 个 Python 开源项目&#xff0c;Github 平均star 2135&#xff0c;希望你能够喜欢~~▌Rank 1&#xff1a;Requests-HTML v0.9(7385 stars on Github&#xff0c;来…

layer中嵌套的页面如何操作父页面_vue中8种组件通信方式,值得收藏

有不少网友提出组件之间通信方式还有很多, 这篇文章便是专门总结组件之间通信的vue是数据驱动视图更新的框架, 所以对于vue来说组件间的数据通信非常重要&#xff0c;那么组件之间如何进行数据通信的呢&#xff1f; 首先我们需要知道在vue中组件之间存在什么样的关系, 才更容易…

镜头视场角计算工具_再谈远心镜头的设计及其独特的性能

1.远心镜头的设计与对比镜头可以分为非远心和远心&#xff1b;远心镜头也可以分为物方远心、像方远心和双远心。相关概念的简单说明&#xff1a;孔径光阑在物空间的像称为入射光瞳。同样&#xff0c;孔径光阑被其后面的光学零件成在像空间的像&#xff0c;称为出射光瞳。入射光…

收到一个机器人txt微盘_经阁-第一章 吞了个机器人-爱阅小说网

第一章 吞了个机器人莫金无奈的感叹着自己的命运&#xff0c;八岁之前他乞讨为生&#xff0c;之后遇到好心人收养&#xff0c;没想到五年后他又要开始无父无母的生活了。只是这下他身后还有个拖油瓶的妹妹。义父、义母穷苦了一辈子&#xff0c;临了也没给莫金留下丁点儿值钱的东…

高斯核函数python代码_单类SVM:SVDD

话接上文(SVM的简单推导)&#xff0c;这篇文章我们来看单类SVM&#xff1a;SVDD。可能大家会觉得很奇怪&#xff0c;我们为什么需要单分类呢&#xff1f;有篇博客举了一个很有意思的例子。花果山上的老猴子&#xff0c;一生阅猴无数&#xff0c;但是从来没有见过其它的物种。有…

collector list 多个分组_【S01E07】groupby方法、GroupBy对象、groupby方法的分组键

Hadley Wickham&#xff08;许多热门R语言包的作者&#xff09;创造了一个用于表示分组运算的术语"split-apply-combine"&#xff08;拆分-应用-合并&#xff09;&#xff0c;这个词很好的描述了整个过程。分组运算的第一个阶段&#xff0c;pandas对象&#xff08;无…

清理垃圾代码bat_来买个小内存u盘么咯?盘内带电脑垃圾清理.bat那种丨heibai.org...

在某宝个别店铺购买了小内存u盘到货后插入电脑&#xff0c;发现自带了一个名为电脑垃圾清理的小程序。对就是这货怀揣着这家店真好&#xff0c;还带了垃圾清理软件的想法&#xff0c;我试着运行了软件.但是好像没有卵用.正好小表弟好像对这个比较了解&#xff0c;我去问问他咋回…

射灯安装方法图解_家居射灯怎么选?第三代宜美SMD射灯给你正解

前段时间&#xff0c;刚把自己的房子完成硬装&#xff0c;在灯具选择的过程中&#xff0c;家人的意见就不太统一。其父母觉得选灯只要够亮就行&#xff0c;而媳妇觉得选灯选贵的才行。到底谁的选灯方法好呢&#xff1f;其实家人们的建议并不是完全不对&#xff0c;灯够亮只是其…

c标签判断true false jsp_北京尚学堂卓越班252天[第042天]——Jsp

1. JSP的核心运行原理1) 客户端浏览器发送请求到服务器&#xff0c;访问a.jsp文件。http://localhost:8989/应用名/a.jsp2) 服务器端接收到请求后所做的处理a) 创建request和response两个对象b) 根据请求中的应用名找到该应用下面的web.xml文件&#xff0c;发现该应用的配置文件…

js aes加密_某高考咨询网js逆向分析笔记

一、某高考资讯网逆向分析某网站的js加密分析&#xff0c;安全签名signsafe HmacSHA1 AES一年前分析过网站数据还没有加密&#xff0c;最近需要获取新的数据发现原先的爬虫失效&#xff0c;请求和响应都经过加密。于是重新分析&#xff0c;记录下分析思路以及分析过程中遇到的…

python语言发明者 google_看看9种编程语言的发明者是怎么说的

从Node.js到C&#xff0c;看他们的发明者是如何评价他们的语言的未来。Ryan Dahl&#xff1a;Node.js问&#xff1a;它的主要优势是什么&#xff1f;Dahl&#xff1a;Node与其他的语言有一点明显的区别&#xff0c;就是处理I/O。所以它永远不允许用户锁上程序。它要求用户不断的…

opencv 的norm_22、OpenCV用卷积Filter2D进行滤波器

迄今为止&#xff0c;看到的函数中&#xff0c;卷积的操作发生在OpenCV函数的内部。理论上&#xff0c;图像卷积就是将内核与图像覆盖区域对应位置相乘之后求和。从调用函数上来看&#xff0c;它需要一个数组参数来描述内核。在实践层面&#xff0c;有一个重要的微妙因素会对结…

初学python有几个阶段_零基础如何系统的学习Python 从7个阶段入手

目前信息化产业发展势头很好&#xff0c;互联网就成为了很多普通人想要涉及的行业&#xff0c;因为相比于传统行业&#xff0c;互联网行业涨薪幅度大&#xff0c;机会也多&#xff0c;所以就会大批的人想要转行来学习Python开发。Python语言的应用Python是它们的主流语言&#…

glide加载gif图不显示动画_用Python绘制会动的柱形竞赛图

我们经常看到的Bar Chart Race&#xff08;柱形竞赛图&#xff09;&#xff0c;可以看到数据的呈现非常的直观。今天就一起来学习下如何生成和上面一样的柱形竞赛图。1、导入Python库2、加载数据集这里使用的是城市人口数据集&#xff0c;加载我们想要的数据&#xff1a;其中&a…

python做后端开发的优点_【后端开发】python语言的特点是什么

python语言的特点是什么&#xff1f;python语言的特点简单Python是一门简单而文字简约的语言。阅读好的Python程序感觉就像阅读英语&#xff0c;尽管是非常严格的英语。Python的这种伪代码特性是其最大强项之一&#xff0c;它可让你专注于解决问题的办法而不是语言本身。容易学…

rust队友开挂_腐蚀RUST开挂玩家识别方法 如何识别玩家开挂

远程查挂是最无奈的选择&#xff0c;也是最后的办法&#xff0c;遇到一些会隐藏的你也查不到。附体附体附体!!这是唯一的方法!!附体是最好的选择&#xff0c;当然gm必须有丰富的游戏经验&#xff0c;800小时以下的玩家不适合做gm(除非有老师傅带)。下面说说如何对付只开透视的老…

不冲突的端口范围_网络中IP地址发生冲突故障怎么办

——————欢迎新老朋友们加入微信群,方便技术讨论&#xff0c;信息互通&#xff0c;行业交流&#xff1a;智能弱电行业专家群&#xff1b;智能弱电行业技术群&#xff1b;智能弱电行业信息群&#xff1b;申请加入请加小编微信&#xff1a;15537112161———————有朋友提…

项目结构_组织结构对项目影响系列课程---项目式组织结构

在前面的几篇文章中我们分别介绍了&#xff0c;系统型&#xff08;简单型&#xff09;&#xff0c;职能型&#xff0c;弱矩阵&#xff0c;平衡矩阵&#xff0c;强矩阵结构的优点和缺点及它们带给项目的影响。今天我们介绍项目式组织结构的优点和缺点及其可能产生的影响。从结构…