一、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