前言

之前介绍了使用devTools进行索引库数据的crud,这里使用的是java程序,使用中间件activeMQ进行数据库和索引库数据的同步。主要是用来完成对数据库的修改来完成对索引库的同步。

正文

前提准备:

1. 索引信息:

结构化的索引,在索引的setting中,使用的是ik分词器,级别是ik-max-word。

mapping映射信息中,使用的dynamic = false,如果不能匹配到结构化索引的字段,则不进行数据的添加和更新。这样的好处是:不添加多余的不需要索引的字段,并且如果添加的字段多的话可以过滤掉无用的而不报错。对数据库添加的很多字段,只添加需要索引的结构化的映射信息。

2. elasticsearch信息

使用的是一台机器上的三个elasticsearch服务端的集群,分别使用的是9301,9300,9302的tcp端口。

创建项目进行数据库的操作

1. 对数据的删除

  1. boolean flag = bookMapper.deleteByPrimaryKey(book.getId()) > 0 ? true : false;
  2. logger.info("删除数据返回的结果:" + flag);
  3. //将消息放入队列中,esQueueDelete:发送消息的类型,消息内容:book.getId().toString()
  4. if (flag) {
  5. producer.sendMessage(esQueueDelete, book.getId().toString());
  6. }
  7. return flag;

2. 对数据的修改

  1. boolean flag = bookMapper.updateByPrimaryKeySelective(book) > 0 ? true : false;
  2. logger.info("更新数据返回的结果:" + flag);
  3. //将消息放入队列中,esQueueUpdate:消息的类型,消息体:将更新的数据转换成json放入消息体
  4. if (flag) {
  5. producer.sendMessage(esQueueUpdate,JSONObject.toJSONStringWithDateFormat(book, Constant.DATETIME_FORMATTION));
  6. }
  7. return flag;

3. 对数据的添加

  1. boolean flag = bookMapper.insertSelective(book) > 0 ? true : false;
  2. logger.info("插入的数据返回的id是{}", book.getId());
  3. /**
  4. * 将数据插入到消息队列中。
  5. * 如果索引创建的时候dynamic字段是false,可以直接传整对象,
  6. * 如果不是,请自行过滤之后传入对象,否则会报错或者添加需要无用字段并被索引。
  7. */
  8. if (flag) {
  9. producer.sendMessage(esQueueCreate, JSONObject.toJSONStringWithDateFormat(book, Constant.DATETIME_FORMATTION));
  10. }
  11. return flag;

ES项目接受消息进行索引库操作

  1. /**
  2. * 根据activeMQ消息订阅,自动将数据插入到索引库
  3. * @param receiveMsg 监听接收到的消息
  4. */
  5. @JmsListener(destination = JmsConfig.QUEUE_CREATE,containerFactory = "jmsListenerContainerQueue")
  6. public void autoInsertData(String receiveMsg){
  7. if (StringUtils.isBlank(receiveMsg)){
  8. logger.error("自动插入数据到索引库====>从消息队列中接收到的消息为空。监听的为:{}", JmsConfig.QUEUE_CREATE);
  9. }
  10. logger.info("自动插入数据到索引库====>从消息队列中接收到的消息为:{}", receiveMsg);
  11. String id = dataService.insertData(receiveMsg, defaultIndex, defaultType);
  12. logger.info("时间:{},监听消息队列:{},插入到索引库成功,id为:{}",LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE), JmsConfig.QUEUE_CREATE, id);
  13. }

需要注意的是:

   @JmsListener(destination = JmsConfig.QUEUE_CREATE,containerFactory = "jmsListenerContainerQueue"),其中:JmsConfig.QUEUE_CREATE必须是常量,表示监听的消息类型。使用的是containerFactory 是jmsListenerContainerQueue

  直接拿到receiveMsg,就是接收的消息体。

具体插入索引库代码

  1. @Override
  2. public String insertData(String content, String index, String type) {
  3. JSONObject jsonObject = JSONObject.parseObject(content);
  4. String id = jsonObject.get(primaryKey).toString();
  5. IndexResponse indexResponse = transportClient.prepareIndex(index, type, id).setSource(jsonObject.toJSONString(), XContentType.JSON).get();
  6. logger.info("插入数据库的数据是:{},插入索引库返回状态:{},插入的id为{}",content, indexResponse.status(), indexResponse.getId());
  7. return indexResponse.getId();
  8. }

删除和更新类似,直接上代码了。

  1. /**
  2. * 根据activeMQ消息订阅,自动将数据插入到索引库
  3. * @param receiveMsg 监听接收到的消息
  4. */
  5. @JmsListener(destination = JmsConfig.QUEUE_CREATE,containerFactory = "jmsListenerContainerQueue")
  6. public void autoInsertData(String receiveMsg){
  7. if (StringUtils.isBlank(receiveMsg)){
  8. logger.error("自动插入数据到索引库====>从消息队列中接收到的消息为空。监听的为:{}", JmsConfig.QUEUE_CREATE);
  9. }
  10. logger.info("自动插入数据到索引库====>从消息队列中接收到的消息为:{}", receiveMsg);
  11. String id = dataService.insertData(receiveMsg, defaultIndex, defaultType);
  12. logger.info("时间:{},监听消息队列:{},插入到索引库成功,id为:{}",LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE), JmsConfig.QUEUE_CREATE, id);
  13. }
  14.  
  15. /**
  16. * 根据订阅的消息,自动从索引库删除数据
  17. * @param receiveMsg
  18. */
  19. @JmsListener(destination = JmsConfig.QUEUE_DELETE,containerFactory = "jmsListenerContainerQueue")
  20. public void autoDeleteData(String receiveMsg){
  21. if (StringUtils.isBlank(receiveMsg)){
  22. logger.error("自动从索引库删除数据===>从消息队列中接收到的消息为空。监听的为:{}", JmsConfig.QUEUE_DELETE);
  23. }
  24. boolean flag = dataService.deleteData(receiveMsg, defaultIndex, defaultType);
  25. logger.info("自动从索引库删除数据===>从消息队列中接收到的消息为:{},删除结果为:{}", receiveMsg, flag);
  26. }
  27.  
  28. /**
  29. * 根据订阅的消息,自动从索引库更新数据
  30. * @param receiveMsg
  31. */
  32. @JmsListener(destination = JmsConfig.QUEUE_UPDATE,containerFactory = "jmsListenerContainerQueue")
  33. public void autoUpdateData(String receiveMsg){
  34. if (StringUtils.isBlank(receiveMsg)){
  35. logger.error("自动从索引库更新数据===>从消息队列中接收到的消息为空。监听的为:{}", JmsConfig.QUEUE_DELETE);
  36. }
  37. logger.info("自动更新数据到索引库====>从消息队列中接收到的消息为:{}", receiveMsg);
  38. boolean flag = dataService.updateData(receiveMsg, defaultIndex, defaultType);
  39. logger.info("自动从索引库更新数据===>从消息队列中接收到的消息为:{},更新结果为:{}", receiveMsg, flag);
  40. }
  41.  
  42. @Override
  43. public String insertData(String content, String index, String type) {
  44. JSONObject jsonObject = JSONObject.parseObject(content);
  45. String id = jsonObject.get(primaryKey).toString();
  46. IndexResponse indexResponse = transportClient.prepareIndex(index, type, id).setSource(jsonObject.toJSONString(), XContentType.JSON).get();
  47. logger.info("插入数据库的数据是:{},插入索引库返回状态:{},插入的id为{}",content, indexResponse.status(), indexResponse.getId());
  48. return indexResponse.getId();
  49. }
  50.  
  51. @Override
  52. public boolean deleteData(String receiveMsg, String index, String type) {
  53. DeleteResponse deleteResponse = transportClient.prepareDelete(index, type, receiveMsg).execute().actionGet();
  54. logger.info("删除索引的结果为:{},删除的索引数据的id为:{}", deleteResponse.status().getStatus(), deleteResponse.getId());
  55. return deleteResponse.status().getStatus() == 200 ? true : false;
  56. }
  57.  
  58. @Override
  59. public boolean updateData(String receiveMsg, String defaultIndex, String defaultType) {
  60. JSONObject jsonObject = JSONObject.parseObject(receiveMsg);
  61. String id = jsonObject.get(primaryKey).toString();
  62. UpdateRequest updateRequest = new UpdateRequest().index(defaultIndex).type(defaultType).id(id).doc(jsonObject.toJSONString(), XContentType.JSON);
  63. UpdateResponse updateResponse = transportClient.update(updateRequest).actionGet();
  64. int status = updateResponse.status().getStatus();
  65. logger.info("更新索引结果:{},更新之后为:{}", status, receiveMsg);
  66. return status == 200 ? true : false;
  67. }

到目前为止,已经可以进行操作数据库同步进行索引库的操作了。但是还是存在很多问题的,主要在于activeMQ的一些问题。以后在解决。

ElasticSearch(十):springboot集成ElasticSearch集群完成数据的增,删,改的更多相关文章

  1. springboot集成redis集群

    1.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  2. springboot集成elasticsearch

    在基础阶段学习ES一般是首先是 安装ES后借助 Kibana 来进行CURD 了解ES的使用: 在进阶阶段可以需要学习ES的底层原理,如何通过Version来实现乐观锁保证ES不出问题等核心原理: 第 ...

  3. elasticsearch系列八:ES 集群管理(集群规划、集群搭建、集群管理)

    一.集群规划 搭建一个集群我们需要考虑如下几个问题: 1. 我们需要多大规模的集群? 2. 集群中的节点角色如何分配? 3. 如何避免脑裂问题? 4. 索引应该设置多少个分片? 5. 分片应该设置几个 ...

  4. elasticsearch基于RBAC认证和集群之间的TLS通讯

    elasticsearch基于RBAC认证和集群之间的TLS通讯 一.背景 二.需要解决的问题 三.给es增加用户名和密码访问 1.修改config/elasticsearch.yml 2.访问es集 ...

  5. ElasticSearch 5学习(7)——分布式集群学习分享2

    前面主要学习了ElasticSearch分布式集群的存储过程中集群.节点和分片的知识(ElasticSearch 5学习(6)--分布式集群学习分享1),下面主要分享应对故障的一些实践. 应对故障 前 ...

  6. ElasticSearch 5学习(6)——分布式集群学习分享1

    在使用中我们把文档存入ElasticSearch,但是如果能够了解ElasticSearch内部是如何存储的,将会对我们学习ElasticSearch有很清晰的认识.本文中的所使用的ElasticSe ...

  7. ElasticSearch和Kibana 5.X集群的安装

    ElasticSearch和Kibana 5.X集群的安装 1.准备工作 1.1.下载安装包 1.2.系统的准备 2.ElasticSearch集群的安装 2.1.修改 config/elastics ...

  8. ElasticSearch入门 第二篇:集群配置

    这是ElasticSearch 2.4 版本系列的第二篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  9. ElasticSearch 深入理解 三:集群部署设计

    ElasticSearch 深入理解 三:集群部署设计 ElasticSearch从名字中也可以知道,它的Elastic跟Search是同等重要的,甚至以Elastic为主要导向. Elastic即可 ...

随机推荐

  1. Codeforces 877E - Danil and a Part-time Job(dfs序+线段树)

    877E - Danil and a Part-time Job 思路:dfs序+线段树 dfs序:http://blog.csdn.net/qq_24489717/article/details/5 ...

  2. js中如何访问对象和数组

    js中如何访问对象和数组 一.总结 一句话总结:js访问对象点和中括号,访问数组的话就是中括号 对象 . [] 数组 [] 1.js访问对象的两种方式? . [] 可以使用下面两种方式访问对象的属性和 ...

  3. .net常见框架

    从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的学习曲线,让我对这个平台产生了浓厚的兴趣,在工作和学习中也积累了一些开源的组件,就目前想到的先整理于此,如果再想到,就继 ...

  4. 使用mothur进行OTU聚类

    微生物16S的OTU聚类工具有很多,最常用的就是 usearch.cdhit-OTU.mothur. 这些工具大多都是针对二代测序平台的,usearch的64bit版本是收费的. 如果要跑PacBio ...

  5. 4-2 什么是WebSocket; Action Cable的使用。Rails guide-6.3视频教学,没有看!

    WebSocket WebSocket是一种在单个TCP连接上进行全双工通讯的协议.WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范.WebSock ...

  6. spoj Prime Generator

    题意:判断ll-rr范围内的质数. 一个个用miller-rabin算法判断 //#pragma comment(linker,"/STACK:1024000000,1024000000&q ...

  7. ZOJ-3329 One Person Game (有环期望问题)

    题目大意:有3个骰子,各有k1,k2,k3个面,面值为1~ki.还有一个计数器,初始值为0,统计所有的面值和.每次同时置这三个骰子,如果第一个骰子的朝上的值为a.第二个值为b.第三个值为c,那么将计数 ...

  8. Leetcode 105

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  9. Netty高性能编程备忘录(上)

    http://calvin1978.blogcn.com/articles/netty-performance.html 网上赞扬Netty高性能的文章不要太多,但如何利用Netty写出高性能网络应用 ...

  10. SDL检查

    在用 Visual Studio 编译比较早的代码时,经常会遇到错误: 错误 C4996 'wcscpy': This function or variable may be unsafe. Cons ...