Elasticsearch
Elasticsearch + spirng boot 연동(UPDATE)
illho
2024. 3. 31. 14:38
특정 데이터 필드 값을 UPDATE 해서 변경해보려고한다.
DocumentApi.java : _bulkDocumentWithBulkProcessor 메소드
else if(data.getActionType().equals(BulkData.Type.UPDATE)){
bulkProcessor.add(new UpdateRequest(data.getIndexName(), data.getId()).doc(data.getJsonMap()));
}
위의 코드를 추가한다.
BULK API를 사용하여 ES에 여러 개의 문서를 한 번에 UPDATE 한다.
UPDATE할 문서의 ID와 변경할 내용을 UpdateRequest 를 통해 지정하여 ES에 전달한다.
IndexApi.java
/**
* 인덱스 존재여부 확인
* @param indexName
* @return
*/
public Boolean existIndex(String indexName) {
boolean acknowledged = false;
try {
GetIndexRequest getIndexRequest = new GetIndexRequest(indexName);
acknowledged = client.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return acknowledged;
}
위의 코드는 주어진 인덱스가 ES 클러스터에 존재하는지 확인하는 메소드이다.
GetIndexRequest 를 사용하여 주어진 인덱스의 존재 여부를 확인한다.
client.indices().exists(getIndexRequest, RequestOptions.DEFAULT)를 호출하여 인덱스가 존재하는지 확인한다. 이 메서드는 인덱스가 존재하면 true를 반환하고, 존재하지 않으면 false를 반환한다.
ElasticSearchSample1.java
@GetMapping("/items/update")
public String updateElasticsearchDoc() {
BulkData bulkData = new BulkData();
ArrayList<BulkData> bulkList = new ArrayList<>();
String indexName = "items";
String id = "item3";
String itemDate = "2024-03-31";
Map<String, Object> map = new HashMap<String,Object>();
map.put("item_date",itemDate);
bulkData.setActionType(BulkData.Type.UPDATE);
bulkData.setIndexName(indexName);
bulkData.setId(id);
bulkData.setJsonMap(map);
bulkList.add(bulkData);
IndexApi indexApi = new IndexApi(client);
if(indexApi.existIndex(indexName)){
DocumentApi documentApi = new DocumentApi(client);
documentApi.bulkDocumentWithBulkProcessor(bulkList, 10000);
}
return "elasticsearch/test";
}
items 인덱스에 id가 items3 인 itemDate 필드의 값을 "2024-03-31"로 바꾸는 코드이다.
현재 item3의 item_date 값은 "2023-12-15" 이다.
실행결과 item_date 의 값이 변경된걸 볼수 있다.