1 安装es,kibana并启动(记住es集群名称)
2 在kibana的 Dev Tools 中创建索引(创建一个名称为estest的结构化索引,数据类型定义好的)
PUT estest { "settings":{ "number_of_shards": 3, "number_of_replicas": 1 }, "mappings":{ "student":{ "properties":{ "id":{ "type":"long" }, "name":{ "type":"text" }, "address":{ "type":"keyword" }, "age":{ "type":"integer" }, "date":{ "type":"date", "format":"yyyy-MM-dd HH:mm:ss|| yyy-MM-dd||epoch_millis" }, "url":{ "type":"text" } } } } }
2 创建springBoot项目并配置
2.1 引入需要的依赖环境
<dependencies> <!--Spring Boot Web 基础环境--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--Spring Boot 测试环境--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <!--elasticsearch--> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>6.8.5</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>6.8.5</version> </dependency> <dependency> <groupId>org.elasticsearch.plugin</groupId> <artifactId>transport-netty4-client</artifactId> <version>6.8.5</version> </dependency> </dependencies>
2.2 配置application.yml文件
# 配置端口 server: port: 8083 # 日志 logging: level: com.liyh.controller: debug
2.3 配置logback.xml文件(控制台打印日志)
<?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!-- 彩色日志依赖的渲染类 --> <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/> <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/> <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/> <!-- 彩色日志格式 --> <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <!-- Console 输出设置 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <charset>utf8</charset> </encoder> </appender> <!-- 不用彩色控制台输出 --> <!--<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!–格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符–> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> </appender>--> <!-- 日志输出级别 --> <root level="INFO"> <appender-ref ref="STDOUT"/> </root> </configuration>
2.3 创建 ElasticSearchController
package com.liyh.controller; import org.springframework.web.bind.annotation.RestController;/** * @Author: liyh * @Date: 2020/9/16 17:12 */ @RestController public class ElasticSearchController { private static int port = 9300;//通过http请求的端口号是9200,通过客户端请求的端口号是9300 // 使用本地的es,每个测试中的 settings 要换成 Settings.EMPTY //private static String host = "localhost"; //elasticsearch的服务器地址 private static String host = "192.168.2.37"; //elasticsearch的服务器地址 }
3 测试连接:
访问地址:http://localhost:8083/connect
代码:
@RequestMapping("connect")
public String connect() throws UnknownHostException {
//1、指定es集群 cluster.name 是固定的key值,docker-cluster是ES集群的名称
Settings settings = Settings.builder()
//设置es集群名称
.put("cluster.name", "docker-cluster")
//增加嗅探机制,找到es集群
.put("client.transport.sniff", true)
.build();
/*
* 创建客户端,所有的操作都由客户端开始,这个就好像是JDBC的Connection对象
* 用完记得要关闭
*/
//2.创建访问ES服务器的客户端
TransportClient client = new PreBuiltTransportClient(settings).addTransportAddresses(
new TransportAddress(InetAddress.getByName(host), port));
System.out.println("client : " + client);
return client.toString();
}
4 向es添加数据
访问地址:http://localhost:8083/testInsert
代码:
//插入数据 @RequestMapping("testInsert") public String testInsert() throws IOException { //1、指定es集群 cluster.name 是固定的key值,docker-cluster是ES集群的名称 Settings settings = Settings.builder().put("cluster.name", "docker-cluster").build(); //获取es主机中节点的ip地址及端口号(以下是单个节点案例) TransportClient client = new PreBuiltTransportClient(settings).addTransportAddresses( new TransportAddress(InetAddress.getByName(host), port)); //将数据转换成文档的格式(后期可以使用java对象,将数据转换成json对象就可以了) XContentBuilder doContentBuilder = XContentFactory.jsonBuilder() .startObject() .field("id", "1") //字段名 : 值 .field("name", "网民") .field("address", "上海虹桥") .field("age", "20") .field("date", "2018-05-20") .field("url", "www.wangmin.com") .endObject(); //添加文档 index1:索引名 blog:类型 10:id //.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE) 代表插入成功后立即刷新,因为ES中插入数据默认分片要1秒钟后再刷新 IndexResponse response = client.prepareIndex("estest", "student", "1") .setSource(doContentBuilder).setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE).get(); //打印出CREATED 表示添加成功 System.out.println(response.status()); return response.status().toString(); }
5 根据id查询es数据
访问地址:http://localhost:8083/testGet/1
代码:
//从es中查询数据 @RequestMapping("testGet/{id}") public String testGet(@PathVariable("id") String id) throws UnknownHostException { //1、指定es集群 cluster.name 是固定的key值,docker-cluster是ES集群的名称 Settings settings = Settings.builder().put("cluster.name", "docker-cluster").build(); //获取es主机中节点的ip地址及端口号(以下是单个节点案例) TransportClient client = new PreBuiltTransportClient(settings).addTransportAddresses( new TransportAddress(InetAddress.getByName(host), port)); //实现数据查询(指定_id查询) 参数分别是 索引名,类型名 id GetResponse getResponse = client.prepareGet("estest", "student",id).get(); String sourceAsString = getResponse.getSourceAsString(); System.out.println(sourceAsString); client.close();//关闭客户端 return sourceAsString; }
6 根据id修改es数据
访问地址:http://localhost:8083/testUpdate/1
访问kibana,年龄修改成功
代码:
//修改数据(指定字段进行修改) @RequestMapping("testUpdate/{id}") public String testUpdate(@PathVariable("id") String id) throws IOException, InterruptedException, ExecutionException { //1、指定es集群 cluster.name 是固定的key值,docker-cluster是ES集群的名称 Settings settings = Settings.builder().put("cluster.name", "docker-cluster").build(); //获取es主机中节点的ip地址及端口号(以下是单个节点案例) TransportClient client = new PreBuiltTransportClient(settings).addTransportAddresses( new TransportAddress(InetAddress.getByName(host), port)); UpdateRequest request = new UpdateRequest(); request.index("estest") //索引名 .type("student") //类型 .id(id)//id .doc( XContentFactory.jsonBuilder() .startObject() .field("age", "33")//要修改的字段 及字段值 .endObject() ); UpdateResponse response = client.update(request).get(); //控制台出现OK 代表更新成功 System.out.println(response.status()); return response.status().toString(); }
7 upsert修改用法:修改数据存在,执行修改,不存在则执行插入
访问地址:http://localhost:8083/testUpsert/2
代码:
//upsert 修改用法:修改数据存在,执行修改,不存在则执行插入 @RequestMapping("testUpsert/{id}") public String testUpsert(@PathVariable("id") String id) throws IOException, InterruptedException, ExecutionException { //1、指定es集群 cluster.name 是固定的key值,docker-cluster是ES集群的名称 Settings settings = Settings.builder().put("cluster.name", "docker-cluster").build(); //获取es主机中节点的ip地址及端口号(以下是单个节点案例) TransportClient client = new PreBuiltTransportClient(settings).addTransportAddresses( new TransportAddress(InetAddress.getByName(host), port)); IndexRequest request1 = new IndexRequest("estest", "student",id).source( XContentFactory.jsonBuilder() .startObject() .field("id", id) //字段名 : 值 .field("name", "刘希") .field("address", "北京天安门") .field("age", "33") .field("date", "1990-11-11") .field("url", "www.liuxi.com") .endObject() ); UpdateRequest request2 = new UpdateRequest("estest", "student",id).doc( XContentFactory.jsonBuilder().startObject() .field("age", "44") .endObject() ).upsert(request1); UpdateResponse response = client.update(request2).get(); //控制台出现OK 代表更新成功, 控制台出现CREATED 代表插入成功 System.out.println(response.status()); return response.status().toString(); }
8 从es中查询所有数据
访问地址:http://localhost:8083/testGetAll
代码:
//从es中查询所有数据 @RequestMapping("testGetAll") public String testGetAll() throws UnknownHostException { //1、指定es集群 cluster.name 是固定的key值,docker-cluster是ES集群的名称 Settings settings = Settings.builder().put("cluster.name", "docker-cluster").build(); //获取es主机中节点的ip地址及端口号(以下是单个节点案例) TransportClient client = new PreBuiltTransportClient(settings).addTransportAddresses( new TransportAddress(InetAddress.getByName(host), port)); QueryBuilder qBuilder = QueryBuilders.matchAllQuery(); SearchResponse sResponse = client.prepareSearch("estest") .setQuery(qBuilder) .get(); SearchHits hits = sResponse.getHits(); for (SearchHit hit : hits) { System.out.println(hit.getSourceAsString()); //将获取的值转换成map的形式 Map<String, Object> map = hit.getSourceAsMap(); System.out.println("url = : " + map.get("url")); for (String key : map.keySet()) { System.out.println(key +" :" +map.get(key)); } System.out.println("=================="); } return "success"; }
9 根据id删除es数据
访问地址:http://localhost:8083/testDelete/1
代码:
//删除数据 @RequestMapping("testDelete/{id}") public String testDelete(@PathVariable("id") String id) throws UnknownHostException { //1、指定es集群 cluster.name 是固定的key值,docker-cluster是ES集群的名称 Settings settings = Settings.builder().put("cluster.name", "docker-cluster").build(); //获取es主机中节点的ip地址及端口号(以下是单个节点案例) TransportClient client = new PreBuiltTransportClient(settings).addTransportAddresses( new TransportAddress(InetAddress.getByName(host), port)); //将数据转换成文档的格式(后期可以使用java对象,将数据转换成json对象就可以了) DeleteResponse response = client.prepareDelete("estest", "student", id).get(); //控制台打印出OK代表删除成功 System.out.println(response.status()); return response.status().toString(); }
10 controller代码
package com.liyh.controller; import org.elasticsearch.action.delete.DeleteResponse; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.support.WriteRequest; import org.elasticsearch.action.update.UpdateRequest; import org.elasticsearch.action.update.UpdateResponse; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHits; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Map; import java.util.concurrent.ExecutionException; /** * @Author: liyh * @Date: 2020/9/16 17:12 */ @RestController public class ElasticSearchController { private static int port = 9300;//通过http请求的端口号是9200,通过客户端请求的端口号是9300 // 使用本地的es,每个测试中的 settings 要换成 Settings.EMPTY //private static String host = "localhost"; //elasticsearch的服务器地址 private static String host = "192.168.2.37"; //elasticsearch的服务器地址 @RequestMapping("connect") public String connect() throws UnknownHostException { //1、指定es集群 cluster.name 是固定的key值,docker-cluster是ES集群的名称 Settings settings = Settings.builder() //设置es集群名称 .put("cluster.name", "docker-cluster") //增加嗅探机制,找到es集群 .put("client.transport.sniff", true) .build(); /* * 创建客户端,所有的操作都由客户端开始,这个就好像是JDBC的Connection对象 * 用完记得要关闭 */ //2.创建访问ES服务器的客户端 TransportClient client = new PreBuiltTransportClient(settings).addTransportAddresses( new TransportAddress(InetAddress.getByName(host), port)); System.out.println("client : " + client); return client.toString(); } //从es中查询数据 @RequestMapping("testGet/{id}") public String testGet(@PathVariable("id") String id) throws UnknownHostException { //1、指定es集群 cluster.name 是固定的key值,docker-cluster是ES集群的名称 Settings settings = Settings.builder().put("cluster.name", "docker-cluster").build(); //获取es主机中节点的ip地址及端口号(以下是单个节点案例) TransportClient client = new PreBuiltTransportClient(settings).addTransportAddresses( new TransportAddress(InetAddress.getByName(host), port)); //实现数据查询(指定_id查询) 参数分别是 索引名,类型名 id GetResponse getResponse = client.prepareGet("estest", "student",id).get(); String sourceAsString = getResponse.getSourceAsString(); System.out.println(sourceAsString); client.close();//关闭客户端 return sourceAsString; } //从es中查询所有数据 @RequestMapping("testGetAll") public String testGetAll() throws UnknownHostException { //1、指定es集群 cluster.name 是固定的key值,docker-cluster是ES集群的名称 Settings settings = Settings.builder().put("cluster.name", "docker-cluster").build(); //获取es主机中节点的ip地址及端口号(以下是单个节点案例) TransportClient client = new PreBuiltTransportClient(settings).addTransportAddresses( new TransportAddress(InetAddress.getByName(host), port)); QueryBuilder qBuilder = QueryBuilders.matchAllQuery(); SearchResponse sResponse = client.prepareSearch("estest") .setQuery(qBuilder) .get(); SearchHits hits = sResponse.getHits(); for (SearchHit hit : hits) { System.out.println(hit.getSourceAsString()); //将获取的值转换成map的形式 Map<String, Object> map = hit.getSourceAsMap(); System.out.println("url = : " + map.get("url")); for (String key : map.keySet()) { System.out.println(key +" :" +map.get(key)); } System.out.println("=================="); } return "success"; } //插入数据 @RequestMapping("testInsert") public String testInsert() throws IOException { //1、指定es集群 cluster.name 是固定的key值,docker-cluster是ES集群的名称 Settings settings = Settings.builder().put("cluster.name", "docker-cluster").build(); //获取es主机中节点的ip地址及端口号(以下是单个节点案例) TransportClient client = new PreBuiltTransportClient(settings).addTransportAddresses( new TransportAddress(InetAddress.getByName(host), port)); //将数据转换成文档的格式(后期可以使用java对象,将数据转换成json对象就可以了) XContentBuilder doContentBuilder = XContentFactory.jsonBuilder() .startObject() .field("id", "1") //字段名 : 值 .field("name", "网民") .field("address", "上海虹桥") .field("age", "20") .field("date", "2018-05-20") .field("url", "www.wangmin.com") .endObject(); //添加文档 index1:索引名 blog:类型 10:id //.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE) 代表插入成功后立即刷新,因为ES中插入数据默认分片要1秒钟后再刷新 IndexResponse response = client.prepareIndex("estest", "student", "1") .setSource(doContentBuilder).setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE).get(); //打印出CREATED 表示添加成功 System.out.println(response.status()); return response.status().toString(); } //删除数据 @RequestMapping("testDelete/{id}") public String testDelete(@PathVariable("id") String id) throws UnknownHostException { //1、指定es集群 cluster.name 是固定的key值,docker-cluster是ES集群的名称 Settings settings = Settings.builder().put("cluster.name", "docker-cluster").build(); //获取es主机中节点的ip地址及端口号(以下是单个节点案例) TransportClient client = new PreBuiltTransportClient(settings).addTransportAddresses( new TransportAddress(InetAddress.getByName(host), port)); //将数据转换成文档的格式(后期可以使用java对象,将数据转换成json对象就可以了) DeleteResponse response = client.prepareDelete("estest", "student", id).get(); //控制台打印出OK代表删除成功 System.out.println(response.status()); return response.status().toString(); } //修改数据(指定字段进行修改) @RequestMapping("testUpdate/{id}") public String testUpdate(@PathVariable("id") String id) throws IOException, InterruptedException, ExecutionException { //1、指定es集群 cluster.name 是固定的key值,docker-cluster是ES集群的名称 Settings settings = Settings.builder().put("cluster.name", "docker-cluster").build(); //获取es主机中节点的ip地址及端口号(以下是单个节点案例) TransportClient client = new PreBuiltTransportClient(settings).addTransportAddresses( new TransportAddress(InetAddress.getByName(host), port)); UpdateRequest request = new UpdateRequest(); request.index("estest") //索引名 .type("student") //类型 .id(id)//id .doc( XContentFactory.jsonBuilder() .startObject() .field("age", "33")//要修改的字段 及字段值 .endObject() ); UpdateResponse response = client.update(request).get(); //控制台出现OK 代表更新成功 System.out.println(response.status()); return response.status().toString(); } //upsert 修改用法:修改数据存在,执行修改,不存在则执行插入 @RequestMapping("testUpsert/{id}") public String testUpsert(@PathVariable("id") String id) throws IOException, InterruptedException, ExecutionException { //1、指定es集群 cluster.name 是固定的key值,docker-cluster是ES集群的名称 Settings settings = Settings.builder().put("cluster.name", "docker-cluster").build(); //获取es主机中节点的ip地址及端口号(以下是单个节点案例) TransportClient client = new PreBuiltTransportClient(settings).addTransportAddresses( new TransportAddress(InetAddress.getByName(host), port)); IndexRequest request1 = new IndexRequest("estest", "student",id).source( XContentFactory.jsonBuilder() .startObject() .field("id", id) //字段名 : 值 .field("name", "刘希") .field("address", "北京天安门") .field("age", "33") .field("date", "1990-11-11") .field("url", "www.liuxi.com") .endObject() ); UpdateRequest request2 = new UpdateRequest("estest", "student",id).doc( XContentFactory.jsonBuilder().startObject() .field("age", "44") .endObject() ).upsert(request1); UpdateResponse response = client.update(request2).get(); //控制台出现OK 代表更新成功, 控制台出现CREATED 代表插入成功 System.out.println(response.status()); return response.status().toString(); } }
11 项目地址
https://gitee.com/liyhGitee/springboot/tree/master/springboot_elasticsearch