1. 集群的搭建
见:ElasticSearch(七)
2. springboot配置集群
2.1 创建springboot项目,使用idea创建,不过多介绍(创建项目时候建议不要勾选elasticsearch,springboot目前自带的elasticsearch版本为5.6.10,如果你版本高于这个版本,还是自己手动导入。)
2.2 导入依赖
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<elasticSearch.version>6.3.2</elasticSearch.version>
</properties>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${elasticSearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>${elasticSearch.version}</version>
<exclusions>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${elasticSearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.plugin</groupId>
<artifactId>transport-netty4-client</artifactId>
<version>${elasticSearch.version}</version>
</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 配置集群信息
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.net.InetAddress; /**
* @Auther: cc
* @Date:
* @Description:
*/
@Configuration
public class ESConfig {
private Logger logger = LoggerFactory.getLogger(this.getClass()); @Value("${elasticsearch.firstIp}")
private String firstIp;
@Value("${elasticsearch.secondIp}")
private String secondIp;
@Value("${elasticsearch.thirdIp}")
private String thirdIp;
@Value("${elasticsearch.firstPort}")
private String firstPort;
@Value("${elasticsearch.secondPort}")
private String secondPort;
@Value("${elasticsearch.thirdPort}")
private String thirdPort;
@Value("${elasticsearch.clusterName}")
private String clusterName; @Bean
public TransportClient getTransportClient() {
logger.info("ElasticSearch初始化开始。。");
logger.info("要连接的节点1的ip是{},端口是{},集群名为{}" , firstIp , firstPort , clusterName);
logger.info("要连接的节点2的ip是{},端口是{},集群名为{}" , secondIp , secondPort , clusterName);
logger.info("要连接的节点3的ip是{},端口是{},集群名为{}" , thirdIp , thirdPort , clusterName);
TransportClient transportClient = null;
try {
Settings settings = Settings.builder()
.put("cluster.name",clusterName) //集群名称
.put("client.transport.sniff",true) //目的是为了可以找到集群,嗅探机制开启
.build();
transportClient = new PreBuiltTransportClient(settings);
TransportAddress firstAddress = new TransportAddress(InetAddress.getByName(firstIp),Integer.parseInt(firstPort));
TransportAddress secondAddress = new TransportAddress(InetAddress.getByName(secondIp),Integer.parseInt(secondPort));
TransportAddress thirdAddress = new TransportAddress(InetAddress.getByName(thirdIp),Integer.parseInt(thirdPort));
transportClient.addTransportAddress(firstAddress);
transportClient.addTransportAddress(secondAddress);
transportClient.addTransportAddress(thirdAddress);
logger.info("ElasticSearch初始化完成。。");
}catch (Exception e){
e.printStackTrace();
logger.error("ElasticSearch初始化失败:" + e.getMessage(),e);
}
return transportClient;
}
}
对于上面代码解释:
3.1.1 首先需要再配置文件中配置服务器集群的所有ip,端口,然后通过@value导入到config类中。
3.2.2 类上必须加@Configuration注解,方法上必须加@Bean注解。
3.2 启动项目,连接集群
启动项目,如果不报错就可行了。
4. 使用springboot操作索引
4.1 创建索引
主要使用方法:
CreateIndexRequest createIndexRequest = Requests.createIndexRequest(index).settings(settings).mapping(type,mapping); //指定setting,mapping创建索引,如果非结构化索引的话,不指定mapping
CreateIndexResponse response = transportClient.admin().indices().create(createIndexRequest).get();
logger.info("建立索引映射成功:" + response.isAcknowledged());
4.2 删除索引
DeleteIndexRequest deleteIndexRequest = Requests.deleteIndexRequest(index); //创建删除索引的请求
DeleteIndexResponse response = transportClient.admin().indices().delete(deleteIndexRequest).get(); //删除索引的响应
logger.info("删除索引结果:{}",response.isAcknowledged());
完整代码如下
import com.cc.es.domain.base.ResultBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse;
import org.elasticsearch.client.Requests;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource;
import java.util.*; /**
* @Auther: Administrator
* @Date: 2018/8/21 07
* @Description:
*/
@Api(value = "Index", tags = "索引")
@RestController
@RequestMapping("index")
public class IndexController { private final String INDEX = "index";
private final String TYPE = "type";
private Logger logger = LoggerFactory.getLogger(this.getClass()); @Resource
private TransportClient transportClient; @ApiOperation(value = "结构化创建索引")
@ApiImplicitParams({
@ApiImplicitParam(name = "index", value = "索引名", required = true, dataType = "String", paramType = "query"),
@ApiImplicitParam(name = "type", value = "类型", required = true, dataType = "Integer", paramType = "query"),
@ApiImplicitParam(name = "fields", value = "结构化索引字段名,不定参数,传入的时候参数名为索引字段名,值为对应的数据类型")
})
@RequestMapping(value = "/create" , method = RequestMethod.POST)
public ResultBean createIndex(@RequestParam Map<String,String> param){
ResultBean resultBean = new ResultBean();
String index = null;
String type = null;
List<String> fieldList = new ArrayList<>();
logger.info("接收的创建索引的参数:" + param);
Set<Map.Entry<String, String>> set = param.entrySet();
for (Map.Entry<String, String> entry: set) {
String key = entry.getKey();
if(key.trim().equals(INDEX)){
index = entry.getValue();
}else if(key.trim().equals(TYPE)){
type = entry.getValue();
}else{
fieldList.add(key);
}
}
if(StringUtils.isBlank(index) || StringUtils.isBlank(type)){
resultBean.setSuccess(false);
resultBean.setMsg("参数错误!");
return resultBean;
}
try {
XContentBuilder settings = XContentFactory.jsonBuilder()
.startObject()
.field("number_of_shards",6)
.field("number_of_replicas",1)
.startObject("analysis").startObject("analyzer").startObject("ik")
.field("tokenizer","ik_max_word")
.endObject().endObject().endObject()
.endObject();
XContentBuilder mapping = XContentFactory.jsonBuilder();
mapping.startObject().field("dynamic","strict").startObject("properties");
for (int i = 0,j = fieldList.size(); i < j; i++) {
String field = fieldList.get(i);
String fieldType = param.get(field);
mapping.startObject(field).field("type",fieldType);
if(fieldType.trim().equals("date")){
mapping.field("format","yyyy-MM-dd HH:mm:ss || yyyy-MM-dd ");
}
mapping.endObject();
}
mapping.endObject().endObject();
CreateIndexRequest createIndexRequest = Requests.createIndexRequest(index).settings(settings).mapping(type,mapping);
CreateIndexResponse response = transportClient.admin().indices().create(createIndexRequest).get();
logger.info("建立索引映射成功:" + response.isAcknowledged());
resultBean.setSuccess(true);
resultBean.setMsg("创建索引成功!");
} catch (Exception e) {
resultBean.setSuccess(false);
resultBean.setMsg("创建索引失败!");
logger.error("创建索引失败!要创建的索引为{},文档类型为{},异常为:",index,type,e.getMessage(),e);
}
return resultBean;
} @ApiOperation(value = "删除索引")
@ApiImplicitParams({
@ApiImplicitParam(name = "index", value = "索引名", required = true, dataType = "String", paramType = "query"),
})
@RequestMapping(value = "/delete" , method = RequestMethod.POST)
public ResultBean deleteIndex(String index){
ResultBean resultBean = new ResultBean();
if (StringUtils.isBlank(index)) {
resultBean.setMsg("参数错误,索引为空");
resultBean.setSuccess(false);
return resultBean;
}
try {
DeleteIndexRequest deleteIndexRequest = Requests.deleteIndexRequest(index);
DeleteIndexResponse response = transportClient.admin().indices().delete(deleteIndexRequest).get();
logger.info("删除索引结果:{}",response.isAcknowledged());
resultBean.setSuccess(response.isAcknowledged());
resultBean.setMsg(response.isAcknowledged() ? "删除索引成功!" : "删除索引失败!");
} catch (Exception e) {
resultBean.setSuccess(false);
resultBean.setMsg("创建索引失败!");
logger.error("删除索引失败!要删除的索引为{},异常为:",index,e.getMessage(),e);
}
return resultBean;
} }
到目前为止,springboot的索引已经完成。这里都是使用的原生的一些api,以后可能还会使用一些别的方法完成。
ElasticSearch(八):springboot集成ElasticSearch集群并使用的更多相关文章
-
springboot集成elasticsearch
在基础阶段学习ES一般是首先是 安装ES后借助 Kibana 来进行CURD 了解ES的使用: 在进阶阶段可以需要学习ES的底层原理,如何通过Version来实现乐观锁保证ES不出问题等核心原理: 第 ...
-
ElasticSearch入门 第二篇:集群配置
这是ElasticSearch 2.4 版本系列的第二篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...
-
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 深入理解 三:集群部署设计 ElasticSearch从名字中也可以知道,它的Elastic跟Search是同等重要的,甚至以Elastic为主要导向. Elastic即可 ...
-
部署elasticsearch(三节点)集群+filebeat+kibana
用途 ▷ 通过各个beat实时收集日志.传输至elasticsearch集群 ▷ 通过kibana展示日志 实验架构 名称:IP地址:CPU:内存 kibana&cerebro:192.168 ...
-
Gitlab CI 集成 Kubernetes 集群部署 Spring Boot 项目
在上一篇博客中,我们成功将 Gitlab CI 部署到了 Docker 中去,成功创建了 Gitlab CI Pipline 来执行 CI/CD 任务.那么这篇文章我们更进一步,将它集成到 K8s 集 ...
-
Springboot2.x集成Redis集群模式
Springboot2.x集成Redis集群模式 说明 Redis集群模式是Redis高可用方案的一种实现方式,通过集群模式可以实现Redis数据多处存储,以及自动的故障转移.如果想了解更多集群模式的 ...
随机推荐
-
Mifare系列6-射频卡与读写器的通信(转)
文/闫鑫原创转载请注明出处http://blog.csdn.net/yxstars/article/details/38085415 1. 复位应答(Answer to request) 读写器呼叫磁 ...
-
Hyper snap
图像->分辨率,设置成300dpi,一般论文的分辨率要求.
-
linux 查看机器的cpu,操作系统等命令
看cpu信息,型号,几核 [root@f3 ~]# cat /proc/cpuinfo | grep name | cut -f2 -d:| uniq -c 16 Intel(R) Xeon(R) C ...
-
弹出框以及提示插件lghdialog.js的使用
以下使用方法 swfupload的使用
-
栈和队列的面试题Java实现
栈和队列: 面试的时候,栈和队列经常会成对出现来考察.本文包含栈和队列的如下考试内容: (1)栈的创建 (2)队列的创建 (3)两个栈实现一个队列 (4)两个队列实现一个栈 (5)设计含最小函数min ...
-
将从数据库中获取的数据 ,以HTML表格的形式显示
1.HTML页面 <body> <form id="form1" runat="server"> <div id="di ...
-
SSH工作原理图
一个请求在Struts2框架中的处理大概分为以下几个步骤 : 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫 ...
-
移动端吸顶(iOS与安卓)
有的时候经常会遇到移动端吸顶效果,开始我也只是上网查了一下,分别有iOS和android两种样式,如下: /*!*Android*!*/ .head { position: fixed; top: 0 ...
-
什么是pyc文件,Python
pyc文件就是 Python 程序编译后得到的字节码文件 (py->pyc).pyc文件一般由3个部分组成:最开始4个字节是一个Maigc int, 标识此pyc的版本信息, 不同的版本的 Ma ...
-
ajax beforeSend 写的显示隐藏代码不执行
ajax如果要写像下方格式 $.ajax({ url: ajaxurl, type: 'POST', dataType: 'json', async:true, data: { }, beforeSe ...