SpringBoot整合ES一个完整的upsert操作
Controller层
@RequestMapping(value = "addAuthTypeForRobot")
public Response addAuthType(@RequestBody AuthType authType) {
return zhwdUserService.addAuthTypeForRobot(authType);
}
service业务层
public Response addAuthTypeForRobot(AuthType authType) {
if (ObjectUtils.isEmpty(authType)) {
return new Response(ResCode.CODE_106, ResCode.MSG_106);
}
if (StringUtils.isEmpty(authType.getUserId()) || StringUtils.isEmpty(authType.getRobotId())) {
return new Response(ResCode.CODE_107, ResCode.MSG_107);
}
return addAuthType(authType);
}
public Response addAuthType(AuthType authType) {
try {
Document document = MongoDBService.findUserIdByOpenId(authType.getUserId());
if (document == null) {
throw new Exception("get userId from mongoDB error.");
}
String userName = document.get("username").toString().replaceAll("[^\u4E00-\u9FA5]", "");
ZhwdUser zhwdUser = getZhwdUserFromEs(authType, userName);
if (null == zhwdUser) {
return new Response(ResCode.CODE_104, ResCode.MSG_104);
}
IndexRequest updateRequest = new IndexRequest();
HashMap updateMap = new HashMap();
updateMap.put("authType", zhwdUser.getAuthType());
updateRequest.source(updateMap);
UpdateQuery updateQuery = new UpdateQueryBuilder()
.withIndexName(Constants.ZHWD_USER)
.withType(Constants.ZHWD_USER_TYPE)
.withId(zhwdUser.getId())
.withClass(ZhwdUser.class)
.withIndexRequest(updateRequest)
.build();
elasticsearchOperations.update(updateQuery);
elasticsearchOperations.refresh(ZhwdUser.class);
return new Response(ResCode.CODE_108, ResCode.MSG_108);
} catch (Exception e) {
LOGGER.error("update user type error!", e);
return new Response(ResCode.CODE_101, ResCode.MSG_101);
}
}
public ZhwdUser getZhwdUserFromEs(AuthType param, String userName) {
ZhwdUser zhwduser = new ZhwdUser();
String userId = param.getUserId();
String robotId = param.getRobotId();
boolean auth = param.isAuthType();
String authType;
if (auth) {
authType = robotId + ":" + 1;
} else {
authType = robotId + ":" + 0;
}
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().
must(QueryBuilders.termQuery("userId", userId)).
must(QueryBuilders.termQuery("userName", userName));
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withIndices(Constants.ZHWD_USER)
.withTypes(Constants.ZHWD_USER_TYPE)
.withQuery(boolQueryBuilder)
.build();
List<ZhwdUser> zhwdUserList = elasticsearchOperations.queryForList(searchQuery, ZhwdUser.class);
if (CollectionUtil.isNotEmpty(zhwdUserList)) {
zhwduser = zhwdUserList.get(0);
List<String> sourcesAuthTypeList = zhwduser.getAuthType();
List<String> targetAuthTypeList = new ArrayList<>();
if (CollectionUtil.isNotEmpty(sourcesAuthTypeList)) {
boolean flag = true;
for (String authElement : sourcesAuthTypeList) {
if (StringUtils.equals(authElement.split(":")[0], robotId)) {
flag = false;
targetAuthTypeList.add(authType);
} else {
targetAuthTypeList.add(authElement);
}
}
if(flag){
targetAuthTypeList.add(authType);
}
} else {
targetAuthTypeList = new ArrayList<>();
targetAuthTypeList.add(authType);
}
zhwduser.setAuthType(targetAuthTypeList);
LOGGER.info(String.format("User Exist!"));
} else {
List<String> authTypeList = new ArrayList<>();
zhwduser.setUserId(userId);
zhwduser.setUserName(userName);
zhwduser.setScore(0);
zhwduser.setType(new ArrayList<>());
zhwduser.setAnswerArea("ALL");
zhwduser.setAuthType(authTypeList);
}
return zhwduser;
}