Java 操作 ElasticSearch,so easy!

松哥原創的 Spring Boot 視頻教程已經殺青,感興趣的小夥伴戳這裏-->Spring Boot+Vue+微人事視頻教程


今天終於可以和小夥伴們分享通過 Java 來操作 ElasticSearch 的相關 API 啦~今天先來看一個簡單的~

Java API 概覽

手動發送 HTTP 請求

低級客戶端

以下是視頻筆記:

注意,筆記只是視頻內容的一個簡要記錄,因此筆記內容比較簡單,完整的內容可以查看視頻。

25.ElasticSearch Java API 概覽

Java 操作 Es 的方案:

  1. 直接使用 HTTP 請求

直接使用 HTTP 請求,去操作 Es。HTTP 請求工具,可以使用 Java 自帶的 HttpUrlConnection,也可以使用一些 HTTP 請求庫,例如 HttpClient、OKHttp、Spring 中的 RestTemplate 都可以。

這種方式有一個弊端,就是要自己組裝請求參數,自己去解析響應的 JSON。

  1. Low Level REST Client

用於 Es 的官方的低級客戶端。這種方式允許通過 HTTP 與 Es 集羣進行通信,但是請求時候的 JSON 參數和響應的 JSON 參數交給用戶去處理。這種方式好處就是兼容所有的 Es 版本。但是就是數據處理比較麻煩。

  1. High Level REST Client

用戶 Es 的官方的高級客戶端。這種方式允許通過 HTTP 與 Es 集羣進行通信,它是基於 Low Level REST Client,但是提供了很多 API,開發者不需要自己去組裝參數,也不需要自己去解析響應 JSON 。這種方式使用起來更加直接。但是需要注意,這種方式,所使用的依賴庫的版本要和 Es 對應。

  1. TransportClient

TransportClient 在 Es7 中已經被棄用,在 Es8 中將被完全刪除。

26.ElasticSearch 普通 HTTP 請求

新建一個普通的 JavaSE 工程,添加如下代碼:

public class HttpRequestTest {
    public static void main(String[] args) throws IOException {
        URL url = new URL("http://localhost:9200/books/_search?pretty=true");
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        if (con.getResponseCode() == 200) {
            BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
            String str = null;
            while ((str = br.readLine()) != null) {
                System.out.println(str);
            }
        }
    }
}

這裏使用到的請求工具是 HttpURLConnection,開發者也可以使用 HttpClient、OkHttp、或者 Spring 中的 RestTemplate。

27.ElasticSearch Java Low Level REST Client

首先創建一個普通的 Maven 工程,添加如下依賴:

<dependencies>
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-client</artifactId>
        <version>7.10.0</version>
    </dependency>
</dependencies>

然後添加如下代碼,發起一個簡單的查詢請求:

public class LowLevelTest {
    public static void main(String[] args) throws IOException {
        //1.構建一個 RestClient 對象
        RestClientBuilder builder = RestClient.builder(
                new HttpHost("localhost"9200"http"),
                new HttpHost("localhost"9201"http"),
                new HttpHost("localhost"9202"http")
        );
        //2.如果需要在請求頭中設置認證信息等,可以通過 builder 來設置
//        builder.setDefaultHeaders(new Header[]{new BasicHeader("key","value")});
        RestClient restClient = builder.build();
        //3.構建請求
        Request request = new Request("GET""/books/_search");
        //添加請求參數
        request.addParameter("pretty","true");
        //4.發起請求,發起請求有兩種方式,可以同步,可以異步
        //這種請求發起方式,會阻塞後面的代碼
        Response response = restClient.performRequest(request);
        //5.解析 response,獲取響應結果
        BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        String str = null;
        while ((str = br.readLine()) != null) {
            System.out.println(str);
        }
        br.close();
        //最後記得關閉 RestClient
        restClient.close();
    }
}

這個查詢請求,是一個同步請求,在請求的過程中,後面的代碼會被阻塞,如果不希望後面的代碼被阻塞,可以使用異步請求。

public class LowLevelTest2 {
    public static void main(String[] args) throws IOException {
        //1.構建一個 RestClient 對象
        RestClientBuilder builder = RestClient.builder(
                new HttpHost("localhost"9200"http"),
                new HttpHost("localhost"9201"http"),
                new HttpHost("localhost"9202"http")
        );
        //2.如果需要在請求頭中設置認證信息等,可以通過 builder 來設置
//        builder.setDefaultHeaders(new Header[]{new BasicHeader("key","value")});
        RestClient restClient = builder.build();
        //3.構建請求
        Request request = new Request("GET""/books/_search");
        //添加請求參數
        request.addParameter("pretty","true");
        //4.發起請求,發起請求有兩種方式,可以同步,可以異步
        //異步請求
        restClient.performRequestAsync(request, new ResponseListener() {
            //請求成功的回調
            @Override
            public void onSuccess(Response response) {
                //5.解析 response,獲取響應結果
                try {
                    BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                    String str = null;
                    while ((str = br.readLine()) != null) {
                        System.out.println(str);
                    }
                    br.close();
                    //最後記得關閉 RestClient
                    restClient.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //請求失敗的回調
            @Override
            public void onFailure(Exception e) {

            }
        });
    }
}

開發者在請求時,也可以攜帶 JSON 參數。

public class LowLevelTest3 {
    public static void main(String[] args) throws IOException {
        //1.構建一個 RestClient 對象
        RestClientBuilder builder = RestClient.builder(
                new HttpHost("localhost"9200"http"),
                new HttpHost("localhost"9201"http"),
                new HttpHost("localhost"9202"http")
        );
        //2.如果需要在請求頭中設置認證信息等,可以通過 builder 來設置
//        builder.setDefaultHeaders(new Header[]{new BasicHeader("key","value")});
        RestClient restClient = builder.build();
        //3.構建請求
        Request request = new Request("GET""/books/_search");
        //添加請求參數
        request.addParameter("pretty","true");
        //添加請求體
        request.setEntity(new NStringEntity("{\"query\": {\"term\": {\"name\": {\"value\": \"java\"}}}}", ContentType.APPLICATION_JSON));
        //4.發起請求,發起請求有兩種方式,可以同步,可以異步
        //異步請求
        restClient.performRequestAsync(request, new ResponseListener() {
            //請求成功的回調
            @Override
            public void onSuccess(Response response) {
                //5.解析 response,獲取響應結果
                try {
                    BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                    String str = null;
                    while ((str = br.readLine()) != null) {
                        System.out.println(str);
                    }
                    br.close();
                    //最後記得關閉 RestClient
                    restClient.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //請求失敗的回調
            @Override
            public void onFailure(Exception e) {

            }
        });
    }
}

ElasticSearch 基礎知識:

  1. 打算出一個 ElasticSearch 教程,誰贊成,誰反對?
  2. ElasticSearch 從安裝開始
  3. ElasticSearch 第三彈,核心概念介紹
  4. ElasticSearch 中的中文分詞器該怎麼玩?
  5. ElasticSearch 索引基本操作
  6. ElasticSearch 文檔的添加、獲取以及更新
  7. ElasticSearch 文檔的刪除和批量操作
  8. ElasticSearch 文檔路由,你的數據到底存在哪一個分片上?
  9. ElasticSearch 併發的處理方式:鎖和版本控制
  10. ElasticSearch 中的倒排索引到底是什麼?
  11. ElasticSearch 動態映射與靜態映射
  12. ElasticSearch 四種字段類型詳解
  13. ElasticSearch 中的地理類型和特殊類型
  14. ElasticSearch 23 種映射參數詳解
  15. ElasticSearch 如何配置某個字段的權重?
  16. ElasticSearch 23 種映射參數詳解【3】
  17. ElasticSearch 映射模版
  18. ElasticSearch 搜索入門
  19. ElasticSearch 全文搜索怎麼玩?
  20. ElasticSearch 打錯字還能搜索到?試試 fuzzy query!
  21. ElasticSearch 複合查詢,理解 Es 中的文檔評分策略!
  22. 想搜索附近評分較高的餐廳,ElasticSearch 大顯身手!
  23. ElasticSearch 如何像 MySQL 一樣做多表聯合查詢?
  24. ElasticSearch 地理位置查詢與特殊查詢
  25. ElasticSearch 搜索高亮與排序
  26. ElasticSearch 指標聚合
  27. ElasticSearch 桶聚合
  28. ElasticSearch 管道聚合



往期推薦
0 1

50+ 需求文檔免費下載!

0 2

Spring Security 教程合集

0 3

接了兩個私活,都是血汗錢


本文分享自微信公衆號 - 江南一點雨(a_javaboy)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

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