RestHighLevelClient:詳解Elasticsearch的Java客戶端

一、RestHighlevelClient批量寫入

批量寫入是一種高效的方式,可以提高寫入速度,同時減少網路開銷。使用RestHighLevelClient進行批量寫入非常容易。下面是一個簡單的例子,展示如何使用RestHighLevelClient進行批量寫入操作。

BulkRequest bulkRequest = new BulkRequest(); 
// 添加多個寫入請求
IndexRequest request1 = new IndexRequest(index, type, "1")
        .source(XContentType.JSON,"title", "Java高級編程", "author", "張三", "createDate",new Date());
bulkRequest.add(request1);    
IndexRequest request2 = new IndexRequest(index, type, "2")
        .source(XContentType.JSON,"title", "Spring Boot開發實戰", "author", "李四", "createDate", new Date());
bulkRequest.add(request2);
BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);

上面的代碼創建了一個BulkRequest對象,然後添加兩個IndexRequest對象到該請求中,最後使用RestHighLevelClient的bulk方法提交批量寫入請求。

二、RestHighLevelClient ES 集群

與Elasticsearch集群通信需要使用RestHighLevelClient。RestHighLevelClient可以輕鬆的與ES集群建立通信並執行各種操作。下面的示例展示了如何使用RestHighLevelClient進行與ES集群的通信。

RestHighLevelClient client = new RestHighLevelClient(
    RestClient.builder(
            new HttpHost("192.168.1.100", 9200, "http"),
            new HttpHost("192.168.1.101", 9200, "http"),
            new HttpHost("192.168.1.102", 9200, "http")));

上面的代碼創建了一個RestHighLevelClient對象並傳入多個HttpHost對象。HttpHost類表示Elasticsearch主機的參數,例如:主機名、埠和方案。

三、RestHighLevelClient 5.3.4

RestHighLevelClient還支持與舊版本的Elasticsearch進行通信。下面是如何使用RestHighLevelClient 5.3.4與Elasticsearch進行通信的簡單示例。

RestHighLevelClient client = new RestHighLevelClient(
    RestClient.builder(
            new HttpHost("localhost", 9200, "http")).setHttpClientConfigCallback(new HttpClientConfigCallback() {
                @Override
                public HttpAsyncClientBuilder customizeHttpClient(
                        HttpAsyncClientBuilder httpClientBuilder) {
                    return httpClientBuilder.setDefaultCredentialsProvider(
                            new BasicCredentialsProvider() {{
                                this.setCredentials(AuthScope.ANY,
                                        new UsernamePasswordCredentials("username", "password"));
                            }});
                }
            }));

上面的代碼創建了一個RestHighLevelClient對象並使用RestClient.builder方法設置了連接的主機和埠。同時也設置了HTTP客戶端SSL和ES節點的認證,以便與ES中具有訪問許可權的用戶進行交互。

四、restHighlevelclient 高級查詢

RestHighLevelClient支持非常複雜的高級查詢操作。下面是一個簡單示例,演示如何使用RestHighLevelClient進行高級查詢操作。

SearchRequest searchRequest = new SearchRequest(index);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); 
MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("title", "Java高級編程"); 
searchSourceBuilder.query(matchQueryBuilder);   
searchRequest.source(searchSourceBuilder); 
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

上面的代碼中,創建了一個SearchRequest對象和一個SearchSourceBuilder對象。然後我們使用MatchQueryBuilder設置查詢請求,最後使用RestHighLevelClient的search方法執行查詢操作。

五、RestHighLevelClient 分頁查詢

RestHighLevelClient可以執行分頁查詢,我們可以使用SearchSourceBuilder設置請求的起始位置和大小。下面是一個簡單的示例,演示如何使用RestHighLevelClient進行分頁查詢操作。

SearchRequest searchRequest = new SearchRequest(index);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); 
searchSourceBuilder.from(0); 
searchSourceBuilder.size(20); 
searchRequest.source(searchSourceBuilder); 
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

上面的代碼中,我們創建了一個SearchRequest對象和一個SearchSourceBuilder對象。然後我們使用from方法設置用戶想要的開始位置。使用size方法設置用戶想要的返回結果的數量。最後使用RestHighLevelClient的search方法執行查詢操作。

六、RestHighLevelClient 重建索引

RestHighLevelClient可以執行重建索引操作。如果需要進行索引的重新構建,則可以使用reindex()方法創建ReindexRequest,並獲取可移植的RestHighLevelClient SDK對象。

ReindexRequest request = new ReindexRequest(); 
request.setSourceIndices("source_index"); 
request.setDestIndex("dest_index"); 
BulkByScrollResponse response = client.reindex(request, RequestOptions.DEFAULT);

上面的代碼中,我們首先創建了一個ReindexRequest對象。然後我們將source_index中所有的數據重建到dest_index,最後使用RestHighLevelClient的reindex方法執行重建操作。

七、RestHighLevelClient分頁工具類

RestHighLevelClient提供了一個非常方便的分頁工具類,可以讓開發人員以非常簡單的方式執行分頁操作。下面是一個展示如何使用RestHighLevelClient分頁工具類的簡單示例代碼。

SearchRequest searchRequest = new SearchRequest(index);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); 
searchSourceBuilder.query(QueryBuilders.matchQuery("title", "Java高級編程")); 
searchSourceBuilder.from(0);  
searchSourceBuilder.size(20); 
SearchResponse searchResponse = PaginatedSearchUtil.search(client, searchRequest, searchSourceBuilder);

上面的代碼中,我們首先執行一個簡單的查詢操作並將請求和SearchSourceBuilder傳遞給PaginatedSearchUtil.search方法,該方法將返回一個SearchResponse對象。

八、RestHighLevelClient高並發

RestHighLevelClient可以快速響應高並發請求。當多個後台線程並發發送請求時,RestHighLevelClient可以保證線程安全,並且不會阻塞主線程。下面是一個演示如何使用RestHighLevelClient實現高並發操作的示例代碼。

ExecutorService executorService = Executors.newFixedThreadPool(50);
for (int i = 0; i < 1000; i++) {
    final String index = "example-index";
    final String type = "_doc";
    executorService.execute(new Runnable() {
        @Override
        public void run() {
            try {
                IndexRequest indexRequest = new IndexRequest(index, type, UUID.randomUUID().toString())
                        .source(XContentType.JSON,"title", "Java高級編程", "author", "張三", "createDate",new Date());
                client.index(indexRequest, RequestOptions.DEFAULT);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });
}

上面的代碼中,我們首先創建了一個包含50個線程的線程池,然後循環了1000次,每次將一個IndexRequest對象添加到線程池中,並使用RestHighLevelClient的index方法執行寫入操作。

九、RestHighLevelClientHolder

RestHighLevelClientHolder類用於持有一個RestHighLevelClient對象,以避免頻繁地創建和銷毀對象。這樣不僅可以節省內存,還可以減少連接ES所需的時間。

public class RestHighLevelClientHolder { 
    private static volatile RestHighLevelClient client = null;
    public static RestHighLevelClient getClient() {
        if (client == null) {
            synchronized (RestHighLevelClientHolder.class) {
                if (client == null) {
                    client = new RestHighLevelClient(
                        RestClient.builder(
                                new HttpHost("localhost", 9200, "http")));
                }
            }
        }
        return client;
    }
}

上面的代碼中,RestHighLevelClientHolder類僅具有一個getClient方法,該方法用於返回一個已創建的RestHighLevelClient對象。如果對象尚未創建,則使用雙重檢查鎖定機制創建新對象。

十、結語

本文我們對RestHighLevelClient的各種用法進行了詳細的說明,實現了從批量寫入、ES集群通信、5.3.4版本兼容、高級查詢、分頁查詢、重建索引、分頁工具類、高並發和單例模式等方面的展示。相信你在實際的工作中也會發現RestHighLevelClient在使用Elasticsearch時非常實用。在使用過程中,我們也需要根據實際需求進行調整,以獲得最佳的使用效果。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/152708.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-13 06:06
下一篇 2024-11-13 06:06

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論