獲取ES客戶端
ES的提供了四種Java客戶端,分別為節點客戶端(node client)、傳輸客戶端(Transport Client)、低級REST客戶端、高級REST客戶端。
節點客戶端作為集群節點的一部分,在集群節點較多的情況下會影響集群的反應速度。
傳輸客戶端客戶端雖然實現了和集群的解耦,相對節點更“輕”,但是會在ES7.0或8.0之后被移除,被“高級Rest客戶端”所取代。
在此截取了ES官方文檔對此的說明。因此學習“高級RestAPI”的使用還是很有必要的。

如下為ES 客戶端的創建:
@Configuration public class ElasticClient { private String host = "10.1.59.101"; private int port = 9200; /** * 獲取Rest高級客戶端 * @return */ @Bean public RestHighLevelClient getRestHighLevelClient(){ RestClientBuilder builder = RestClient.builder(new HttpHost(host, port)); return new RestHighLevelClient(builder); } /** * 獲取Rest低級客戶端 * @return */ @Bean public RestClient getRestClient(){ RestClient build = RestClient.builder(new HttpHost(host)).build(); return build; }
下面介紹下ES在Java中基本的文檔增刪改查操作
索引操作
索引即我們的新增操作,ES提供了三種形式的索引,分別為通過Json字符串、Map集合、XContentBuilder實現索引操作
示例如下:
public void save(User user) { RestHighLevelClient client = elasticClient.getRestHighLevelClient(); //Json字符串作為數據源 IndexRequest indexRequest1 = new IndexRequest( "02", "book", "3"); String jsonString = "{" + "\"name\":\"生命的誕生\"," + "\"type\":\"科學\"," + "\"price\":\"170\"" + "}"; indexRequest1.source(jsonString, XContentType.JSON); //Map集合作為數據源 Map jsonMap = new HashMap<>(); jsonMap.put("user", "userByMap"); jsonMap.put("postDate", new Date()); jsonMap.put("message", "messageByMap"); IndexRequest indexRequest2 = new IndexRequest("posts", "doc", "34") .source(jsonMap); //XContentBuilder作為數據源 XContentBuilder builder = null; try { builder = XContentFactory.jsonBuilder(); builder.startObject(); builder.field("user", "userXXX"); builder.timeField("postDate", new Date()); builder.field("message", "messageXXX"); builder.endObject(); } catch (IOException e) { e.printStackTrace(); } IndexRequest indexRequest3 = new IndexRequest("posts", "doc", "1") .source(builder); try { IndexResponse indexResponse1 = client.index(indexRequest1, RequestOptions.DEFAULT); client.index(indexRequest2, RequestOptions.DEFAULT); client.index(indexRequest3, RequestOptions.DEFAULT); client.close(); } catch (IOException e) { e.printStackTrace(); } }
查詢
根據索引、類型、ID 查詢文檔,示例如下
public void get(){ RestHighLevelClient client = elasticClient.getRestHighLevelClient(); GetRequest getRequest = new GetRequest( "posts", "doc", "1"); try { GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT); client.close(); } catch (IOException e) { e.printStackTrace(); } }
刪除
public void delete(){ RestHighLevelClient client = elasticClient.getRestHighLevelClient(); DeleteRequest deleteRequest = new DeleteRequest("02", "book", "2"); deleteRequest.timeout(TimeValue.timeValueMinutes(10)); deleteRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_UNTIL); try { client.delete(deleteRequest, RequestOptions.DEFAULT); client.close(); } catch (IOException e) { e.printStackTrace(); } }
更新
public void update(User user){ RestHighLevelClient client = elasticClient.getRestHighLevelClient(); UpdateRequest updateRequest = new UpdateRequest("posts", "doc", "35"); Map map = new HashMap<>(); map.put("message", "message_update"); map.put("user", "user_update"); updateRequest.doc(user.toJsonString(), XContentType.JSON); try { client.update(updateRequest, RequestOptions.DEFAULT); client.close(); } catch (IOException e) { e.printStackTrace(); } }
查詢文檔是否存在
public void exists() { RestHighLevelClient client = elasticClient.getRestHighLevelClient(); GetRequest getRequest = new GetRequest("posts","doc","33"); GetResponse getResponse = null; try { getRequest.fetchSourceContext(new FetchSourceContext(false));//禁用獲取 _source字段 getRequest.storedFields("_none_");//禁用獲取存儲字段。 boolean exists = client.exists(getRequest, RequestOptions.DEFAULT); client.close(); } catch (Exception e) { e.printStackTrace(); } }
Bulk批量操作
bulk可以批量執行多條操作語句,bulk支持批量操作不同的命令,例如批量更新和刪除
public void bulk(User user){ RestHighLevelClient client = elasticClient.getRestHighLevelClient(); User user2 = new User(); user2.setName("周大福"); user2.setAge(211); user2.setPosition("珠寶"); BulkRequest bulkRequest = new BulkRequest(); IndexRequest indexRequest1 = new IndexRequest("posts", "doc", "41").source(user.toJsonString(), XContentType.JSON); IndexRequest indexRequest2 = new IndexRequest("posts", "doc", "42").source(user2.toJsonString(), XContentType.JSON); DeleteRequest deleteRequest = new DeleteRequest("01", "law", "3"); bulkRequest.add(indexRequest1); bulkRequest.add(indexRequest2); bulkRequest.add(deleteRequest); try { client.bulk(bulkRequest, RequestOptions.DEFAULT); client.close(); } catch (IOException e) { e.printStackTrace(); } }
