Java操作ElasticSearch(二、文件的操作)
阿新 • • 發佈:2022-12-07
接著Java操作ElasticSearch(一、索引庫的操作),繼續學習文件的相關操作
新增文件
新增文件的步驟大致如下
- 從資料庫查詢文件資料
- 建立 IndexRequest 物件,並指定索引庫名稱
- 指定新增資料的 id
- 將新增的文件資料變成 JSON 格式
- 將 JSON 資料新增到 IndexRequest 中
- 發起請求,得到結果
如果需要從資料庫查詢資料,然後再新增進 es 索引庫,就需要在單元測試類中初始化 UserService 物件
private UserService userService = new UserService();
例子1,新增文件(沒有從資料庫讀,自己手寫一條 JSON 格式資料)
@Test public void test05() throws IOException { // 獲取客戶端物件,指定索引庫名稱 IndexRequest request = new IndexRequest("user"); // 設定文件編號 request.id("1"); // 設定文件資料資訊 String jsonString = "{\n" + " \"name\": \"李連杰\",\n" + " \"age\": 25,\n" + " \"gender\": \"男\",\n" + " \"note\": \"李連杰正在打架~\"\n" + "}"; request.source(jsonString, XContentType.JSON); // 傳送請求給es,並接收響應結果 IndexResponse response = client.index(request, RequestOptions.DEFAULT); // 列印響應結果 System.out.println(response.status()); // CREATED }
例子2,新增文件(從資料庫讀一條資料)
@Test public void test06() throws IOException { // 從資料庫查詢一條記錄 User user = userService.findById(2L); // 獲取客戶端物件,指定索引庫名稱 IndexRequest request = new IndexRequest("user"); // 設定文件編號 request.id(user.getId() + ""); // 轉換為 JSON 格式字串 String jsonString = JSON.toJSONString(user); System.out.println(jsonString); // {"age":21,"gender":"男","id":2,"name":"李四","note":"李四同學在傳智學Java"} // 設定文件資料資訊 request.source(jsonString, XContentType.JSON); // 傳送請求給es,並接收響應結果 IndexResponse response = client.index(request, RequestOptions.DEFAULT); // 列印響應結果 System.out.println(response.status()); // CREATED }
查詢文件
首先這裡介紹一下根據 id 查詢
查詢文件的步驟大致如下
- 建立 GetRequest 物件,並指定索引庫名稱、文件 id
- 發起請求,得到結果
- 從結果中得到 source,是 JSON 字串
- 將 JSON 字串反序列化為物件
@Test public void test07() throws IOException { // 獲取文件物件,語義描述 GetRequest request = new GetRequest("user", "2"); // 傳送請求,獲取文件物件 GetResponse response = client.get(request, RequestOptions.DEFAULT); // 獲取響應結果中的資料資訊 String sourceAsString = response.getSourceAsString(); System.out.println(sourceAsString); // {"age":21,"gender":"男","id":2,"name":"李四","note":"李四同學在傳智學Java"} // 解析響應結果字串 User user = JSON.parseObject(sourceAsString, User.class); System.out.println(user); // User(id=2, name=李四, age=21, gender=男, note=李四同學在傳智學Java) }
修改文件
新增時,如果 id 一致就會覆蓋舊的資料,實現修改,但是如果我們只修改文件中的某個欄位,可以使用另外的 api
例子1,新增時,id一致,覆蓋舊的資料
@Test public void test05() throws IOException { // 獲取客戶端物件,指定索引庫名稱 IndexRequest request = new IndexRequest("user"); // 設定文件編號 request.id("1"); // 設定文件資料資訊 String jsonString = "{\n" + " \"name\": \"李連杰\",\n" + " \"age\": 29,\n" + " \"gender\": \"男\",\n" + " \"note\": \"李連杰正在喝酒~\"\n" + "}"; request.source(jsonString, XContentType.JSON); // 傳送請求給es,並接收響應結果 IndexResponse response = client.index(request, RequestOptions.DEFAULT); // 列印響應結果 System.out.println(response.status()); // OK }
例子2,使用其他的 api 修改單個欄位
步驟如下
- 建立 UpdateRequest 物件,指定索引庫名稱,文件 id
- 指定要修改的欄位及屬性值
- 發起請求
@Test public void test08() throws IOException { // 獲取文件物件,語義描述 UpdateRequest request = new UpdateRequest("user", "1"); // 設定需要修改的欄位資訊 request.doc("name", "成龍"); // 傳送請求,獲取文件物件 UpdateResponse response = client.update(request, RequestOptions.DEFAULT); // 列印響應結果 System.out.println(response.getResult()); // UPDATED }
刪除文件
直接根據 id 刪除即可
@Test public void test09() throws IOException { // 獲取文件物件,語義描述 DeleteRequest request = new DeleteRequest("user", "2"); // 傳送請求,獲取文件物件 DeleteResponse response = client.delete(request, RequestOptions.DEFAULT); // 列印響應結果 System.out.println(response.getResult()); // DELETED }
批處理
如果我們需要把資料庫中的所有使用者資訊都匯入索引庫,可以批量查詢出多個使用者,但是剛剛的新增文件是一次新增一個文件,這樣效率太低了
因此 ElasticSearch 提供了批處理的方案:BulkRequest
一個 BulkRequest 可以在一次請求中執行多個 新增、更新、刪除請求。
所以,BulkRequest 就是把多個其它增、刪、改請求整合,然後一起傳送到 ES 來執行。
拿批量新增舉例
- 從資料庫查詢文件資料
- 建立BulkRequest 物件
- 建立多個 IndexRequest 物件,組織文件資料,並新增到 BulkRequest 中
- 發起請求
@Test public void test10() throws IOException { // 從資料庫查詢所有資料 List<User> list = userService.findAll(); BulkRequest bulkRequest = new BulkRequest("user"); for (User user : list) { IndexRequest request = new IndexRequest(); request.id(user.getId().toString()); String jsonString = JSON.toJSONString(user); request.source(jsonString, XContentType.JSON); bulkRequest.add(request); } BulkResponse responses = client.bulk(bulkRequest, RequestOptions.DEFAULT); System.out.println(responses.status()); // OK }