HighLevelRestAPI를 쓰다보면 map형식의 데이터를 기존 색인 데이터와 비교해서 색인을 업데이트 하고싶은 경우가 생기는대 이런 경우는 보통 doc에 존재 하지 않기 때문에 googling을 통해 기능을 찾게 된다.
시간도 오래걸리고 찾아 놓은게 아까워서 정리한다.
ES version: 6.6.1
1. 색인 데이터
GET market-search/_doc/7744252
...
"shopping_basket" : {
"item_id": 7744252
"apple" : 4,
"banana" : 0
}
...
2. _update_by_query 명령어
하기 스크립트는 'params' 값을 'script'에서 map 형식으로 가져와 'param'값과 현 색인의 'item_id'가 동일 할때 'param'설정 값에 따라 색인 값을 업데이트 하는 스크립트이다. 'terms'안에 있는 조건을 설정해서 쿼리를 실행하자.
POST market-search/_update_by_query
{
"script": {
"source": """
for (String key : params.keySet()) {
if (params[key].item_id == ctx._source.item_id){
if(params[key].apple == 0){
ctx._source.shopping_basket.remove('apple');
}
if(params[key].banana == 0){
ctx._source.shopping_basket.remove('banana');
}
break;
}
}
""",
"lang": "painless",
"params": {
"7744252":
{
"item_id": 7744252,
"apple": 1,
"banana": 3
},
"7744253":
{
"item_id": 7744253,
"apple": 2,
"banana": 0
}
}
},
"query": {
"terms": {
"_id": [
"7744252"
]
}
}
}
3. HighLevelRestAPI with java 로 적용해 보기
해당 스크립트를 동일하게 java api에서도 사용 가능하다.(bulk api 활용)
Map<String, Object> jsonMap = convertObjToJsonMap(vpc.getShopping_basket());
XContentBuilder jb = XContentFactory.jsonBuilder();
BulkRequest request = new BulkRequest();
jb.startObject().field("shopping_basket",jsonMap).endObject(); // entity
request.add(
new UpdateRequest(index, "_doc", key)
.id(key)
.type("_doc")
.doc(jb)
);
restClient.bulk(request, RequestOptions.DEFAULT)//RestHighLevelClient
JsonMap 변환
ES에서는 Map<String, Object> 형태로 바꿔주면 알아서 컨버팅해서 ES 쿼리를 생성하므로 하기 같은 함수 하나 만들어서 적용하면 쉽게 Object를 JasonMap 형식으로 사용 할 수있다.
public static Map<String, Object> convertObjToJsonMap(Object obj) throws IllegalAccessException {
Map<String, Object> parameters = new HashMap<>();
for(Field field :obj.getClass().getDeclaredFields()){
field.setAccessible(true);
String name = field.getName();
Object value = field.get(obj);
if(value != null){
parameters.put(name,value);
}
}
return parameters;
}
반응형
사업자 정보 표시
라울앤알바 | 장수호 | 서울특별시 관악구 봉천로 13나길 58-10, 404호(봉천동) | 사업자 등록번호 : 363-72-00290 | TEL : 010-5790-0933 | Mail : shjang@raulnalba.com | 통신판매신고번호 : 2020-서울관악-0892호 | 사이버몰의 이용약관 바로가기
'programmer > Elasticsearch' 카테고리의 다른 글
Elasticsearch to PowerBI (0) | 2021.12.21 |
---|---|
Elasticsearch log4j2 보안 이슈 (0) | 2021.12.21 |
update nested field in an index of elasticsearch with java api (0) | 2021.12.06 |
4. [Elasticsearch] kibana 설치 (0) | 2021.12.03 |
3. [Elasticsearch] ES 설치하기 (0) | 2021.12.03 |