1. 程式人生 > 其它 >Java操作ElasticSearch(二、文件的操作)

Java操作ElasticSearch(二、文件的操作)

接著Java操作ElasticSearch(一、索引庫的操作),繼續學習文件的相關操作

新增文件

新增文件的步驟大致如下

  1. 從資料庫查詢文件資料
  2. 建立 IndexRequest 物件,並指定索引庫名稱
  3. 指定新增資料的 id
  4. 將新增的文件資料變成 JSON 格式
  5. 將 JSON 資料新增到 IndexRequest 中
  6. 發起請求,得到結果

如果需要從資料庫查詢資料,然後再新增進 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 查詢

查詢文件的步驟大致如下

  1. 建立 GetRequest 物件,並指定索引庫名稱、文件 id
  2. 發起請求,得到結果
  3. 從結果中得到 source,是 JSON 字串
  4. 將 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 修改單個欄位

步驟如下

  1. 建立 UpdateRequest 物件,指定索引庫名稱,文件 id
  2. 指定要修改的欄位及屬性值
  3. 發起請求
@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 來執行。

拿批量新增舉例

  1. 從資料庫查詢文件資料
  2. 建立BulkRequest 物件
  3. 建立多個 IndexRequest 物件,組織文件資料,並新增到 BulkRequest 中
  4. 發起請求
@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
}