1. 程式人生 > 實用技巧 >java通過SpringBoot操作elasticsearch實現基本的增刪改查

java通過SpringBoot操作elasticsearch實現基本的增刪改查

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">
            &lt;!&ndash;格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌訊息,%n是換行符&ndash;&gt;
            <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