java通過SpringBoot操作elasticsearch實現基本的增刪改查
阿新 • • 發佈:2020-09-17
java通過SpringBoot操作elasticsearch實現基本的增刪改查:
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(); }
7upsert修改用法:修改資料存在,執行修改,不存在則執行插入
訪問地址: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