1. 集群的搭建

见:ElasticSearch(七)

2. springboot配置集群

2.1 创建springboot项目,使用idea创建,不过多介绍(创建项目时候建议不要勾选elasticsearch,springboot目前自带的elasticsearch版本为5.6.10,如果你版本高于这个版本,还是自己手动导入。)

2.2 导入依赖

  1. <properties>
  2. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  3. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  4. <java.version>1.8</java.version>
  5. <elasticSearch.version>6.3.2</elasticSearch.version>
  6. </properties>
  7. <dependency>
  8. <groupId>org.elasticsearch</groupId>
  9. <artifactId>elasticsearch</artifactId>
  10.  <version>${elasticSearch.version}</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.elasticsearch.client</groupId>
  14. <artifactId>transport</artifactId>
  15. <version>${elasticSearch.version}</version>
  16. <exclusions>
  17. <exclusion>
  18. <groupId>org.elasticsearch</groupId>
  19. <artifactId>elasticsearch</artifactId>
  20. </exclusion>
  21. </exclusions>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.elasticsearch.client</groupId>
  25. <artifactId>elasticsearch-rest-high-level-client</artifactId>
  26. <version>${elasticSearch.version}</version>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.elasticsearch.plugin</groupId>
  30. <artifactId>transport-netty4-client</artifactId>
  31. <version>${elasticSearch.version}</version>
  32. </dependency>

对于依赖需要说明的几点:

2.2.1. org.elasticsearch.client--transport 依赖添加之后,会依赖一系列的插件,客户端等,虽然在springboot2.0中依旧依赖  org.elasticsearch-elasticsearch-6.3.2,但是在依赖列表中,其添加的依赖依然是elasticSearch5.6.10的依赖,所以必须排除这个依赖,手动添加org.elasticsearch-elasticsearch6.3.2的依赖,目前只有这种解决方法,否则导致版本不一致冲突。如下:

当我排除 org.elasticsearch.client.transport的elasticsearch的依赖之后,重新添加elasticsearch 6.3.2的依赖之后,就显示的是同样的elasticsearch6.3.2。显示如下:

2.2.2. 这时候如果你再springboot中配置了TransportClient的方法Bean,则启动项目,会报错:

这是因为:transport-netty4-client的版本是5.6.0,而我们使用的所有的elasticsearch版本都是6.3.2,导致jar包冲突,所以,我们必须将transport-netty4-client的版本更新到6.3.2。

这就需要导入jar:org.elasticsearch.plugin----transport-netty4-client 的jar,(具体依赖将上面),这时候transport-netty4-client的版本也是6.3.2了。

2.2.3. 到这里已经可以使用elasticsearch的集群了,不过我们又导入了一个 elasticsearch-rest-high-level-client的jar,目的是:为了使用某些特殊的api。参见:https://www.cnblogs.com/ginb/p/8716485.html

3. 启动项目,连接elasticSearch集群

3.1 配置集群信息

  1. import org.elasticsearch.client.transport.TransportClient;
  2. import org.elasticsearch.common.settings.Settings;
  3. import org.elasticsearch.common.transport.TransportAddress;
  4. import org.elasticsearch.transport.client.PreBuiltTransportClient;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import org.springframework.beans.factory.annotation.Value;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. import java.net.InetAddress;
  11.  
  12. /**
  13. * @Auther: cc
  14. * @Date:
  15. * @Description:
  16. */
  17. @Configuration
  18. public class ESConfig {
  19. private Logger logger = LoggerFactory.getLogger(this.getClass());
  20.  
  21. @Value("${elasticsearch.firstIp}")
  22. private String firstIp;
  23. @Value("${elasticsearch.secondIp}")
  24. private String secondIp;
  25. @Value("${elasticsearch.thirdIp}")
  26. private String thirdIp;
  27. @Value("${elasticsearch.firstPort}")
  28. private String firstPort;
  29. @Value("${elasticsearch.secondPort}")
  30. private String secondPort;
  31. @Value("${elasticsearch.thirdPort}")
  32. private String thirdPort;
  33. @Value("${elasticsearch.clusterName}")
  34. private String clusterName;
  35.  
  36. @Bean
  37. public TransportClient getTransportClient() {
  38. logger.info("ElasticSearch初始化开始。。");
  39. logger.info("要连接的节点1的ip是{},端口是{},集群名为{}" , firstIp , firstPort , clusterName);
  40. logger.info("要连接的节点2的ip是{},端口是{},集群名为{}" , secondIp , secondPort , clusterName);
  41. logger.info("要连接的节点3的ip是{},端口是{},集群名为{}" , thirdIp , thirdPort , clusterName);
  42. TransportClient transportClient = null;
  43. try {
  44. Settings settings = Settings.builder()
  45. .put("cluster.name",clusterName)    //集群名称
  46. .put("client.transport.sniff",true)  //目的是为了可以找到集群,嗅探机制开启
  47. .build();
  48. transportClient = new PreBuiltTransportClient(settings);
  49. TransportAddress firstAddress = new TransportAddress(InetAddress.getByName(firstIp),Integer.parseInt(firstPort));
  50. TransportAddress secondAddress = new TransportAddress(InetAddress.getByName(secondIp),Integer.parseInt(secondPort));
  51. TransportAddress thirdAddress = new TransportAddress(InetAddress.getByName(thirdIp),Integer.parseInt(thirdPort));
  52. transportClient.addTransportAddress(firstAddress);
  53. transportClient.addTransportAddress(secondAddress);
  54. transportClient.addTransportAddress(thirdAddress);
  55. logger.info("ElasticSearch初始化完成。。");
  56. }catch (Exception e){
  57. e.printStackTrace();
  58. logger.error("ElasticSearch初始化失败:" + e.getMessage(),e);
  59. }
  60. return transportClient;
  61. }
  62. }

对于上面代码解释:

3.1.1 首先需要再配置文件中配置服务器集群的所有ip,端口,然后通过@value导入到config类中。

3.2.2 类上必须加@Configuration注解,方法上必须加@Bean注解。

3.2 启动项目,连接集群

启动项目,如果不报错就可行了。

4. 使用springboot操作索引

4.1 创建索引

主要使用方法:

  1. CreateIndexRequest createIndexRequest = Requests.createIndexRequest(index).settings(settings).mapping(type,mapping);  //指定setting,mapping创建索引,如果非结构化索引的话,不指定mapping
  2. CreateIndexResponse response = transportClient.admin().indices().create(createIndexRequest).get();
  3. logger.info("建立索引映射成功:" + response.isAcknowledged());

4.2 删除索引

  1. DeleteIndexRequest deleteIndexRequest = Requests.deleteIndexRequest(index);                  //创建删除索引的请求
  2. DeleteIndexResponse response = transportClient.admin().indices().delete(deleteIndexRequest).get();    //删除索引的响应
  3. logger.info("删除索引结果:{}",response.isAcknowledged());

完整代码如下

  1. import com.cc.es.domain.base.ResultBean;
  2. import io.swagger.annotations.Api;
  3. import io.swagger.annotations.ApiImplicitParam;
  4. import io.swagger.annotations.ApiImplicitParams;
  5. import io.swagger.annotations.ApiOperation;
  6. import org.apache.commons.lang3.StringUtils;
  7. import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
  8. import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
  9. import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
  10. import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse;
  11. import org.elasticsearch.client.Requests;
  12. import org.elasticsearch.client.transport.TransportClient;
  13. import org.elasticsearch.common.xcontent.XContentBuilder;
  14. import org.elasticsearch.common.xcontent.XContentFactory;
  15. import org.slf4j.Logger;
  16. import org.slf4j.LoggerFactory;
  17. import org.springframework.web.bind.annotation.RequestMapping;
  18. import org.springframework.web.bind.annotation.RequestMethod;
  19. import org.springframework.web.bind.annotation.RequestParam;
  20. import org.springframework.web.bind.annotation.RestController;
  21.  
  22. import javax.annotation.Resource;
  23. import java.util.*;
  24.  
  25. /**
  26. * @Auther: Administrator
  27. * @Date: 2018/8/21 07
  28. * @Description:
  29. */
  30. @Api(value = "Index", tags = "索引")
  31. @RestController
  32. @RequestMapping("index")
  33. public class IndexController {
  34.  
  35. private final String INDEX = "index";
  36. private final String TYPE = "type";
  37. private Logger logger = LoggerFactory.getLogger(this.getClass());
  38.  
  39. @Resource
  40. private TransportClient transportClient;
  41.  
  42. @ApiOperation(value = "结构化创建索引")
  43. @ApiImplicitParams({
  44. @ApiImplicitParam(name = "index", value = "索引名", required = true, dataType = "String", paramType = "query"),
  45. @ApiImplicitParam(name = "type", value = "类型", required = true, dataType = "Integer", paramType = "query"),
  46. @ApiImplicitParam(name = "fields", value = "结构化索引字段名,不定参数,传入的时候参数名为索引字段名,值为对应的数据类型")
  47. })
  48. @RequestMapping(value = "/create" , method = RequestMethod.POST)
  49. public ResultBean createIndex(@RequestParam Map<String,String> param){
  50. ResultBean resultBean = new ResultBean();
  51. String index = null;
  52. String type = null;
  53. List<String> fieldList = new ArrayList<>();
  54. logger.info("接收的创建索引的参数:" + param);
  55. Set<Map.Entry<String, String>> set = param.entrySet();
  56. for (Map.Entry<String, String> entry: set) {
  57. String key = entry.getKey();
  58. if(key.trim().equals(INDEX)){
  59. index = entry.getValue();
  60. }else if(key.trim().equals(TYPE)){
  61. type = entry.getValue();
  62. }else{
  63. fieldList.add(key);
  64. }
  65. }
  66. if(StringUtils.isBlank(index) || StringUtils.isBlank(type)){
  67. resultBean.setSuccess(false);
  68. resultBean.setMsg("参数错误!");
  69. return resultBean;
  70. }
  71. try {
  72. XContentBuilder settings = XContentFactory.jsonBuilder()
  73. .startObject()
  74. .field("number_of_shards",6)
  75. .field("number_of_replicas",1)
  76. .startObject("analysis").startObject("analyzer").startObject("ik")
  77. .field("tokenizer","ik_max_word")
  78. .endObject().endObject().endObject()
  79. .endObject();
  80. XContentBuilder mapping = XContentFactory.jsonBuilder();
  81. mapping.startObject().field("dynamic","strict").startObject("properties");
  82. for (int i = 0,j = fieldList.size(); i < j; i++) {
  83. String field = fieldList.get(i);
  84. String fieldType = param.get(field);
  85. mapping.startObject(field).field("type",fieldType);
  86. if(fieldType.trim().equals("date")){
  87. mapping.field("format","yyyy-MM-dd HH:mm:ss || yyyy-MM-dd ");
  88. }
  89. mapping.endObject();
  90. }
  91. mapping.endObject().endObject();
  92. CreateIndexRequest createIndexRequest = Requests.createIndexRequest(index).settings(settings).mapping(type,mapping);
  93. CreateIndexResponse response = transportClient.admin().indices().create(createIndexRequest).get();
  94. logger.info("建立索引映射成功:" + response.isAcknowledged());
  95. resultBean.setSuccess(true);
  96. resultBean.setMsg("创建索引成功!");
  97. } catch (Exception e) {
  98. resultBean.setSuccess(false);
  99. resultBean.setMsg("创建索引失败!");
  100. logger.error("创建索引失败!要创建的索引为{},文档类型为{},异常为:",index,type,e.getMessage(),e);
  101. }
  102. return resultBean;
  103. }
  104.  
  105. @ApiOperation(value = "删除索引")
  106. @ApiImplicitParams({
  107. @ApiImplicitParam(name = "index", value = "索引名", required = true, dataType = "String", paramType = "query"),
  108. })
  109. @RequestMapping(value = "/delete" , method = RequestMethod.POST)
  110. public ResultBean deleteIndex(String index){
  111. ResultBean resultBean = new ResultBean();
  112. if (StringUtils.isBlank(index)) {
  113. resultBean.setMsg("参数错误,索引为空");
  114. resultBean.setSuccess(false);
  115. return resultBean;
  116. }
  117. try {
  118. DeleteIndexRequest deleteIndexRequest = Requests.deleteIndexRequest(index);
  119. DeleteIndexResponse response = transportClient.admin().indices().delete(deleteIndexRequest).get();
  120. logger.info("删除索引结果:{}",response.isAcknowledged());
  121. resultBean.setSuccess(response.isAcknowledged());
  122. resultBean.setMsg(response.isAcknowledged() ? "删除索引成功!" : "删除索引失败!");
  123. } catch (Exception e) {
  124. resultBean.setSuccess(false);
  125. resultBean.setMsg("创建索引失败!");
  126. logger.error("删除索引失败!要删除的索引为{},异常为:",index,e.getMessage(),e);
  127. }
  128. return resultBean;
  129. }
  130.  
  131. }

到目前为止,springboot的索引已经完成。这里都是使用的原生的一些api,以后可能还会使用一些别的方法完成。

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入门 第二篇:集群配置

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

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

  9. 部署elasticsearch(三节点)集群+filebeat+kibana

    用途 ▷ 通过各个beat实时收集日志.传输至elasticsearch集群 ▷ 通过kibana展示日志 实验架构 名称:IP地址:CPU:内存 kibana&cerebro:192.168 ...

  10. Gitlab CI 集成 Kubernetes 集群部署 Spring Boot 项目

    在上一篇博客中,我们成功将 Gitlab CI 部署到了 Docker 中去,成功创建了 Gitlab CI Pipline 来执行 CI/CD 任务.那么这篇文章我们更进一步,将它集成到 K8s 集 ...

随机推荐

  1. Bootstrap 栅格系统(布局)

    基本用法  网格系统用来布局,其实就是列的组合.Bootstrap框架的网格系统中有四种基本的用法.由于Bootstrap框架在不同屏幕尺寸使用了不同的网格样式,在这一节中所涉及到的示例,我们都以中屏 ...

  2. win7创建 VirtualBox COM 对象失败。 应用程序现在将终止。 Callee RC: E_NOINTERFACE (0x80004002)

    win7创建 VirtualBox COM 对象失败.  应用程序现在将终止.    Callee RC: E_NOINTERFACE (0x80004002) 启动VirtualBox提示这个错误, ...

  3. python--HTTPClient接口测试踩坑

    1.今天下午做接口测试的时候遇到一个奇怪的问题:原因不明 requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisc ...

  4. python怎样压缩和解压缩ZIP文件

    https://zhidao.baidu.com/question/1498409764366387259.html

  5. Zookeeper架构、ZAB协议、选举

    转载:深入浅出Zookeeper(一) Zookeeper架构及FastLeaderElection机制  (nice) ZooKeeper学习第六期---ZooKeeper机制架构 一.Zookee ...

  6. 利用express.js连接mongodb数据库

    var MongoClient = require('mongodb').MongoClient; var DB_CONN_STR = "mongodb://localhost:27017/ ...

  7. RM报表,点击保存,为何每次都显示 另存为的对话框?

    function TRMDesignerForm.FileSave: Boolean; var lSaved: Boolean; lFileName: string; begin Result := ...

  8. POJ 2242 The Circumference of the Circle

    做题回顾:用到海伦公式,还有注意数据类型,最好统一 p=(a+b+c)/2; s=sqrt(p*(p-a)*(p-b)*(p-c));//三角形面积,海伦公式 r=a*b*c/(4*s);//这是外接 ...

  9. LeetCode OJ:Valid Number

    Validate if a given string is numeric. Some examples:"0" => true" 0.1 " => ...

  10. (C/C++学习笔记) 十. 函数

    十. 函数 ● 基本概念 函数 函数定义 function definition: return_type function_name ( parameter list ) { Body of fun ...