es的rest-high-level-client使用

elasticsearch的官方文檔的鏈接在此 

https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/index.html

如果不想看這文章, 請出門左轉直接去看官方的api, 寫的非常詳細, 也寫的很多

簡單介紹下兩種api 

Java REST Client 有兩種風格:

Java Low Level REST Client :用於Elasticsearch的官方低級客戶端。它允許通過http與Elasticsearch集羣通信。
將請求編排和響應反編排留給用戶自己處理。它兼容所有的Elasticsearch版本。
(PS:學過WebService的話,對編排與反編排這個概念
應該不陌生。可以理解爲對請求參數的封裝,以及對響應結果的解析)

Java High Level REST Client :用於Elasticsearch的官方高級客戶端。它是基於低級客戶端的,
它提供很多API,並負責請求的編排與響應的反編排。
(PS:就好比是,一個是傳自己拼接好的字符串,並且自己解析返回的結果;而另一個是傳對象,
返回的結果也已經封裝好了,
直接是對象,更加規範了參數的名稱以及格式,更加面對對象一點)
(PS:所謂低級與高級,我覺得一個很形象的比喻是,面向過程編程與面向對象編程)
使用需與ES版本保持一致

在 Elasticsearch 7.0 中不建議使用TransportClient,並且在8.0中會完全刪除TransportClient。
因此,官方更建議我們用Java High Level REST Client,它執行HTTP請求,
而不是序列號的Java請求。既然如此,這裏就直接用高級了。

所以我就直接使用了es的最新版本7.3.1 , 這個es的啓動需要jdk11, java的代碼環境需要jdk8 以上.

當然了, 你可以和我一樣裝了jdk8 和11 ,然後在es的配置文件中加上這麼一句

修改es的elasticsearch.bat 文件, 再最前面加上一個

set JAVA_HOME=C:\soft\jdk11    就不會使用window配置的默認的jdk 了,使用11.

使用的maven座標

<dependencies>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.5</version>
        </dependency>
    </dependencies>

新建log4j2.xml, 一定要有這個, 不然啓動報錯.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Root level="error">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

 

其實High Level REST Client 都有兩種編程風格, 一種是同步的, 一種是異步的操作, 異步的操作添加一個監聽器, 監聽返回的結果即可.

在案例中了, 全部使用同步的進行操作.

package com.onyx;

import org.apache.http.HttpHost;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;

import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author zk
 * @Description: es的api crud的練習
 * @date 2019-09-12 8:50
 */
public class UserCRUD {

    public static void main(String[] args) throws IOException, InterruptedException {
        RestHighLevelClient client = new RestHighLevelClient(
                //因爲使用的是http, 所以這裏是9200 ,不是對應的9300,這是個大坑!
                RestClient.builder(new HttpHost("localhost", 9200, "http")));

        //createDoc(client);
        //TimeUnit.SECONDS.sleep(2);
        //getDoc(client);

        //existsDoc(client);
        //deleteDoc(client);

        //updateDoc(client);



        client.close();
    }


    /**
     * 更新doc
     * @param client
     * @throws IOException
     */
    private static void updateDoc(RestHighLevelClient client) throws IOException {
        //不存在的更新會報錯
        Map<String, Object> jsonMap = new HashMap<String, Object>();
        jsonMap.put("postDate", new Date());
        jsonMap.put("message", "daily update");
        UpdateRequest updateRequest = new UpdateRequest("posts", "3").doc(jsonMap);
        UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
        System.out.println(updateResponse.status());
    }


    /**
     * 刪除文檔
     * @param client
     * @throws IOException
     */
    private static void deleteDoc(RestHighLevelClient client) throws IOException {
        DeleteRequest request = new DeleteRequest("posts", "1");
        DeleteResponse delete = client.delete(request, RequestOptions.DEFAULT);
        System.out.println(delete.status() + "~" + delete.getResult());
    }


    /**
     * 文檔是否存在
     * @param client
     * @throws IOException
     */
    private static void existsDoc(RestHighLevelClient client) throws IOException {
        for (int i = 1; i <5; i++) {
            GetRequest request = new GetRequest("posts", String.valueOf(i));
            request.fetchSourceContext(new FetchSourceContext(false));
            request.storedFields("_none_");
            boolean exists = client.exists(request, RequestOptions.DEFAULT);
            System.out.println(exists);
        }


        /*GetRequest request2 = new GetRequest("posts", "5");
        request.fetchSourceContext(new FetchSourceContext(false));
        request.storedFields("_none_");
        boolean exists2 = client.exists(request2, RequestOptions.DEFAULT);
        System.out.println(exists2);*/

    }


    /**
     * 獲取一個文檔
     * @param client
     * @throws IOException
     */
    private static void getDoc(RestHighLevelClient client) throws IOException {
        //沒有posts 會報錯的
        GetRequest posts = new GetRequest("posts", "1");
        GetResponse response = client.get(posts, RequestOptions.DEFAULT);
        System.out.println(response.getId());
        System.out.println(response.getIndex());
        System.out.println(response.getSourceAsString());
        System.out.println(response.getSourceAsMap());
    }


    /**
     * 創建一個文檔
     * @param client
     * @throws IOException
     */
    private static void createDoc(RestHighLevelClient client) throws IOException {
        IndexRequest request = new IndexRequest("posts");
        request.id("1");
        String jsonString = "{" +
                "\"user\":\"zk\"," +
                "\"postDate\":\"2019-01-30\"," +
                "\"message\":\"trying out java\"" +
                "}";
        String jsonString2 = "{" +
                "\"user\":\"zk2\"," +
                "\"postDate\":\"2019-10-01\"," +
                "\"message\":\"trying out javascript\"" +
                "}";
        //爲什麼這裏要有個jsonString2 ,因爲這個request.source(jsonString, jsonString2);
        // 的參數數量必須是偶數, 不然會報錯的.
        request.source(jsonString, jsonString2);
        IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
        System.out.println(indexResponse.getResult());


        Map<String, Object> jsonMap = new HashMap<String, Object>();
        jsonMap.put("user", "ting");
        jsonMap.put("postDate", new Date());
        jsonMap.put("message", "trying out hadoop");
        IndexRequest post = new IndexRequest("post").id("2").source(jsonMap);
        client.index(post, RequestOptions.DEFAULT);


        XContentBuilder builder = XContentFactory.jsonBuilder();
        builder.startObject();
        {
            builder.field("user", "wang");
            builder.timeField("postDate", new Date());
            builder.field("message", "trying out scala");
        }
        builder.endObject();
        IndexRequest posts = new IndexRequest("posts").id("3").source(builder);
        client.index(posts, RequestOptions.DEFAULT);


        IndexRequest source = new IndexRequest("posts").id("4").source("user", "peng",
                "postDate", new Date(),
                "message", "trying out golang");

        client.index(source, RequestOptions.DEFAULT);
    }

}

Java Framework,歡迎各位前來交流java相關
QQ羣:965125360

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章