ElasticSearch(十):springboot集成ElasticSearch集群完成数据的增,删,改
前言
之前介绍了使用devTools进行索引库数据的crud,这里使用的是java程序,使用中间件activeMQ进行数据库和索引库数据的同步。主要是用来完成对数据库的修改来完成对索引库的同步。
正文
前提准备:
1. 索引信息:
结构化的索引,在索引的setting中,使用的是ik分词器,级别是ik-max-word。
mapping映射信息中,使用的dynamic = false,如果不能匹配到结构化索引的字段,则不进行数据的添加和更新。这样的好处是:不添加多余的不需要索引的字段,并且如果添加的字段多的话可以过滤掉无用的而不报错。对数据库添加的很多字段,只添加需要索引的结构化的映射信息。
2. elasticsearch信息
使用的是一台机器上的三个elasticsearch服务端的集群,分别使用的是9301,9300,9302的tcp端口。
创建项目进行数据库的操作
1. 对数据的删除
- boolean flag = bookMapper.deleteByPrimaryKey(book.getId()) > 0 ? true : false;
- logger.info("删除数据返回的结果:" + flag);
- //将消息放入队列中,esQueueDelete:发送消息的类型,消息内容:book.getId().toString()
- if (flag) {
- producer.sendMessage(esQueueDelete, book.getId().toString());
- }
- return flag;
2. 对数据的修改
- boolean flag = bookMapper.updateByPrimaryKeySelective(book) > 0 ? true : false;
- logger.info("更新数据返回的结果:" + flag);
- //将消息放入队列中,esQueueUpdate:消息的类型,消息体:将更新的数据转换成json放入消息体
- if (flag) {
- producer.sendMessage(esQueueUpdate,JSONObject.toJSONStringWithDateFormat(book, Constant.DATETIME_FORMATTION));
- }
- return flag;
3. 对数据的添加
- boolean flag = bookMapper.insertSelective(book) > 0 ? true : false;
- logger.info("插入的数据返回的id是{}", book.getId());
- /**
- * 将数据插入到消息队列中。
- * 如果索引创建的时候dynamic字段是false,可以直接传整对象,
- * 如果不是,请自行过滤之后传入对象,否则会报错或者添加需要无用字段并被索引。
- */
- if (flag) {
- producer.sendMessage(esQueueCreate, JSONObject.toJSONStringWithDateFormat(book, Constant.DATETIME_FORMATTION));
- }
- return flag;
ES项目接受消息进行索引库操作
- /**
- * 根据activeMQ消息订阅,自动将数据插入到索引库
- * @param receiveMsg 监听接收到的消息
- */
- @JmsListener(destination = JmsConfig.QUEUE_CREATE,containerFactory = "jmsListenerContainerQueue")
- public void autoInsertData(String receiveMsg){
- if (StringUtils.isBlank(receiveMsg)){
- logger.error("自动插入数据到索引库====>从消息队列中接收到的消息为空。监听的为:{}", JmsConfig.QUEUE_CREATE);
- }
- logger.info("自动插入数据到索引库====>从消息队列中接收到的消息为:{}", receiveMsg);
- String id = dataService.insertData(receiveMsg, defaultIndex, defaultType);
- logger.info("时间:{},监听消息队列:{},插入到索引库成功,id为:{}",LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE), JmsConfig.QUEUE_CREATE, id);
- }
需要注意的是:
@JmsListener(destination = JmsConfig.QUEUE_CREATE,containerFactory = "jmsListenerContainerQueue"),其中:JmsConfig.QUEUE_CREATE必须是常量,表示监听的消息类型。使用的是containerFactory 是jmsListenerContainerQueue
直接拿到receiveMsg,就是接收的消息体。
具体插入索引库代码
- @Override
- public String insertData(String content, String index, String type) {
- JSONObject jsonObject = JSONObject.parseObject(content);
- String id = jsonObject.get(primaryKey).toString();
- IndexResponse indexResponse = transportClient.prepareIndex(index, type, id).setSource(jsonObject.toJSONString(), XContentType.JSON).get();
- logger.info("插入数据库的数据是:{},插入索引库返回状态:{},插入的id为{}",content, indexResponse.status(), indexResponse.getId());
- return indexResponse.getId();
- }
删除和更新类似,直接上代码了。
- /**
- * 根据activeMQ消息订阅,自动将数据插入到索引库
- * @param receiveMsg 监听接收到的消息
- */
- @JmsListener(destination = JmsConfig.QUEUE_CREATE,containerFactory = "jmsListenerContainerQueue")
- public void autoInsertData(String receiveMsg){
- if (StringUtils.isBlank(receiveMsg)){
- logger.error("自动插入数据到索引库====>从消息队列中接收到的消息为空。监听的为:{}", JmsConfig.QUEUE_CREATE);
- }
- logger.info("自动插入数据到索引库====>从消息队列中接收到的消息为:{}", receiveMsg);
- String id = dataService.insertData(receiveMsg, defaultIndex, defaultType);
- logger.info("时间:{},监听消息队列:{},插入到索引库成功,id为:{}",LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE), JmsConfig.QUEUE_CREATE, id);
- }
- /**
- * 根据订阅的消息,自动从索引库删除数据
- * @param receiveMsg
- */
- @JmsListener(destination = JmsConfig.QUEUE_DELETE,containerFactory = "jmsListenerContainerQueue")
- public void autoDeleteData(String receiveMsg){
- if (StringUtils.isBlank(receiveMsg)){
- logger.error("自动从索引库删除数据===>从消息队列中接收到的消息为空。监听的为:{}", JmsConfig.QUEUE_DELETE);
- }
- boolean flag = dataService.deleteData(receiveMsg, defaultIndex, defaultType);
- logger.info("自动从索引库删除数据===>从消息队列中接收到的消息为:{},删除结果为:{}", receiveMsg, flag);
- }
- /**
- * 根据订阅的消息,自动从索引库更新数据
- * @param receiveMsg
- */
- @JmsListener(destination = JmsConfig.QUEUE_UPDATE,containerFactory = "jmsListenerContainerQueue")
- public void autoUpdateData(String receiveMsg){
- if (StringUtils.isBlank(receiveMsg)){
- logger.error("自动从索引库更新数据===>从消息队列中接收到的消息为空。监听的为:{}", JmsConfig.QUEUE_DELETE);
- }
- logger.info("自动更新数据到索引库====>从消息队列中接收到的消息为:{}", receiveMsg);
- boolean flag = dataService.updateData(receiveMsg, defaultIndex, defaultType);
- logger.info("自动从索引库更新数据===>从消息队列中接收到的消息为:{},更新结果为:{}", receiveMsg, flag);
- }
- @Override
- public String insertData(String content, String index, String type) {
- JSONObject jsonObject = JSONObject.parseObject(content);
- String id = jsonObject.get(primaryKey).toString();
- IndexResponse indexResponse = transportClient.prepareIndex(index, type, id).setSource(jsonObject.toJSONString(), XContentType.JSON).get();
- logger.info("插入数据库的数据是:{},插入索引库返回状态:{},插入的id为{}",content, indexResponse.status(), indexResponse.getId());
- return indexResponse.getId();
- }
- @Override
- public boolean deleteData(String receiveMsg, String index, String type) {
- DeleteResponse deleteResponse = transportClient.prepareDelete(index, type, receiveMsg).execute().actionGet();
- logger.info("删除索引的结果为:{},删除的索引数据的id为:{}", deleteResponse.status().getStatus(), deleteResponse.getId());
- return deleteResponse.status().getStatus() == 200 ? true : false;
- }
- @Override
- public boolean updateData(String receiveMsg, String defaultIndex, String defaultType) {
- JSONObject jsonObject = JSONObject.parseObject(receiveMsg);
- String id = jsonObject.get(primaryKey).toString();
- UpdateRequest updateRequest = new UpdateRequest().index(defaultIndex).type(defaultType).id(id).doc(jsonObject.toJSONString(), XContentType.JSON);
- UpdateResponse updateResponse = transportClient.update(updateRequest).actionGet();
- int status = updateResponse.status().getStatus();
- logger.info("更新索引结果:{},更新之后为:{}", status, receiveMsg);
- return status == 200 ? true : false;
- }
到目前为止,已经可以进行操作数据库同步进行索引库的操作了。但是还是存在很多问题的,主要在于activeMQ的一些问题。以后在解决。
ElasticSearch(十):springboot集成ElasticSearch集群完成数据的增,删,改的更多相关文章
- springboot集成redis集群
1.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...
- springboot集成elasticsearch
在基础阶段学习ES一般是首先是 安装ES后借助 Kibana 来进行CURD 了解ES的使用: 在进阶阶段可以需要学习ES的底层原理,如何通过Version来实现乐观锁保证ES不出问题等核心原理: 第 ...
- elasticsearch系列八:ES 集群管理(集群规划、集群搭建、集群管理)
一.集群规划 搭建一个集群我们需要考虑如下几个问题: 1. 我们需要多大规模的集群? 2. 集群中的节点角色如何分配? 3. 如何避免脑裂问题? 4. 索引应该设置多少个分片? 5. 分片应该设置几个 ...
- elasticsearch基于RBAC认证和集群之间的TLS通讯
elasticsearch基于RBAC认证和集群之间的TLS通讯 一.背景 二.需要解决的问题 三.给es增加用户名和密码访问 1.修改config/elasticsearch.yml 2.访问es集 ...
- ElasticSearch 5学习(7)——分布式集群学习分享2
前面主要学习了ElasticSearch分布式集群的存储过程中集群.节点和分片的知识(ElasticSearch 5学习(6)--分布式集群学习分享1),下面主要分享应对故障的一些实践. 应对故障 前 ...
- ElasticSearch 5学习(6)——分布式集群学习分享1
在使用中我们把文档存入ElasticSearch,但是如果能够了解ElasticSearch内部是如何存储的,将会对我们学习ElasticSearch有很清晰的认识.本文中的所使用的ElasticSe ...
- ElasticSearch和Kibana 5.X集群的安装
ElasticSearch和Kibana 5.X集群的安装 1.准备工作 1.1.下载安装包 1.2.系统的准备 2.ElasticSearch集群的安装 2.1.修改 config/elastics ...
- ElasticSearch入门 第二篇:集群配置
这是ElasticSearch 2.4 版本系列的第二篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...
- ElasticSearch 深入理解 三:集群部署设计
ElasticSearch 深入理解 三:集群部署设计 ElasticSearch从名字中也可以知道,它的Elastic跟Search是同等重要的,甚至以Elastic为主要导向. Elastic即可 ...
随机推荐
- Linux - 命令重定向
命令重定向, 就是将目前得到的数据转移到指定的地方.分为以下几种: >>>1>2>1>>2>>< 1. > 与 >>先看一 ...
- Java 密码扩展无限制权限策略文件[转]
因为某些国家的进口管制限制,Java发布的运行环境包中的加解密有一定的限制.比如默认不允许256位密钥的AES加解密,解决方法就是修改策略文件. 官方网站提供了JCE无限制权限策略文件的下载: JDK ...
- LeetCode--203--删除链表中的节点
问题描述: 删除链表中等于给定值 val 的所有节点. 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2->3 ...
- android沉浸状态栏和顶部状态栏背景色的设置
法一: 现在很多应用都引用了沉浸式状态栏,如QQ,效果下图: 这样的效果很酷炫,其实设置很简单. 不过要说明的是,这种效果只能在API19以及以上版本中才能够做到. 如果想让界面Activity中实现 ...
- Jersey 2.x 探索新建的工程
如果用 Jersey maven archetype 成功创建了这个项目,那么在你当前的路径下就已经创建了一个名为simple-service项目.它包含了一个标准的Maven项目结构: 说明 文件目 ...
- zzuli 1726 迷宫 BFS(题意)
1726: 迷宫 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 502 Solved: 80 SubmitStatusWeb Board Descri ...
- 87. Scramble String *HARD* 动态规划
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...
- 在python中是没有NULL的,取而代之的是None,它的含义是为空
在python中是没有NULL的,取而代之的是None,它的含义是为空
- JavaScript学习总结(五)——Javascript中==和===的区别
一.JavaScript"=="的作用 当==两边的内容是字符串时,则比较字符串的内容是否相等. 当==两边的内容是数字时,则比较数字的大小是否相等. 当==两边的内容是对象或者是 ...
- swiper中的默认值的属性和作用(小程序交流群:604788754)
swiper中的重要属性: vertical:属性,控制swiper效果是水平切换滚动,还是垂直切换滚动.如果不设置此属性,默认是水平滚动,如果设置:vertical="true" ...