没什么只是.一个demo
package net.csdn.service.tag.impl; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import love.cq.util.StringUtil; import net.csdn.exception.ArgumentErrorException; import net.csdn.pojo.tag.ObjTag; import net.csdn.pojo.tag.Tag; import net.csdn.service.tag.util.domain.MyTag; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.apache.commons.lang.StringUtils; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; import org.nutz.log.Log; import org.nutz.log.Logs; @IocBean public class DocTagService { private static final Log log = Logs.getLog("DocTagService"); @Inject private TagsManageService tagsManageService = null; @Inject private DocStoreRemoteService docStoreRemoteService; public boolean insert(String typeName, String jsonDate, String tagsStr) { if (StringUtils.isBlank(tagsStr)) { throw new ArgumentErrorException("tags 不可以为空"); } ObjTag objTag = null; JSONObject fromObject = JSONObject.fromObject(jsonDate); log.info(fromObject.get("id") + " " + tagsStr); String[] tags = tagsStr.split(","); String body = StringUtil.rmHtmlTag(fromObject.getString("body")); // /如果正文为空 if (StringUtil.isBlank(body) || tags == null || tags.length == 0) { return false; } String tempTagStr = null; // 删除这条记录 delete(typeName, fromObject.getInt("id")); for (int i = 0; i < tags.length; i++) { // 先查询tags是否存在于数据库中.如果不存在就创建一个 tempTagStr = tags[i].toLowerCase().trim(); if (StringUtil.isBlank(tempTagStr)) { continue; } Tag tag = tagsManageService.findTagByName(tempTagStr); if (tag == null) { tag = new Tag(); tag.setName(tempTagStr); tagsManageService.saveTag(tag); } // 插入一条记录到数据库中 objTag = new ObjTag(); objTag.setObject_id(fromObject.getInt("id")); objTag.setTag_id(tag.getId()); objTag.setCreated_at(fromObject.getLong("created_at")); try { objTag.setChannel_id(fromObject.getInt("channel_id")); } catch (Exception e) { log.info("channel get error!"); } tagsManageService.saveAbstractObjTag(typeName, objTag); } return true; } public void setTagsManageService(TagsManageService tagsManageService) { this.tagsManageService = tagsManageService; } /** * 在tag系统中删除文章 * * @param typeName * @param objectId */ public void delete(String typeName, Integer objectId) { // TODO Auto-generated method stub if (objectId == null) { throw new ArgumentErrorException("待删除文章Id 不可以为空"); } tagsManageService.deleteDocTag(typeName, objectId); } /** * 超早tag的数量 * * @param typeName * @param objectId */ public int findTagCount(String typeName, Integer objectId) { // TODO Auto-generated method stub if (objectId == null) { throw new ArgumentErrorException("待删除文章Id 不可以为空"); } return tagsManageService.findTagCount(typeName, objectId); } /** * tag补录,慎用会覆盖用户原本的tag * * @param type * @param fromId * @param endId * @return */ public void updateTagByDoc(String typeName, int fromId, int endId, RecommenderService rs, HashMap<String, Integer> tagMap, boolean needSuggestTag) { // TODO Auto-generated method stub StringBuilder sb = new StringBuilder(); fromId = Math.max(fromId, 1); for (int i = fromId; i <= endId; i++) { if (i % 100 == 0) { sb.append(i); try { insertTagsAndUpdateMongo(typeName, sb.toString(), rs, tagMap, needSuggestTag); } catch (Exception e) { // TODO Auto-generated catch block log.error(e + " " + sb); } sb = new StringBuilder(); } else { sb.append(i + ","); } } // 补录 if (sb != null && sb.length() > 0) { sb.append(0); try { insertTagsAndUpdateMongo(typeName, sb.toString(), rs, tagMap, needSuggestTag); } catch (Exception e) { // TODO Auto-generated catch block log.error(e + " " + sb); } } } /** * 插入tag * * @param typeName * @param ids * @param rs * @param tagMap */ private void insertTagsAndUpdateMongo(String typeName, String ids, RecommenderService rs, HashMap<String, Integer> tagMap, boolean needSuggestTag) { // TODO Auto-generated method stub JSONArray objs = docStoreRemoteService.findByIds(typeName, null, ids); JSONArray newObjs = new JSONArray(); // 如果mongo那什么都没查出来就不走后面的了 if (objs == null || objs.size() == 0) { return; } // 删除所有的关联 tagsManageService.deleteDocTagByIds(typeName, ids); List<ObjTag> all = new ArrayList<ObjTag>(); String title = null; String body = null; // 重新插入 for (Object object : objs) { JSONObject job = (JSONObject) object; // 防止出现空hash if (job.size() <= 3) { continue; } List<MyTag> tag_suggest = null; try { StringBuilder sb = new StringBuilder(); if (needSuggestTag) { try { title = job.getString("title"); } catch (Exception e) { } try { body = job.getString("body"); } catch (Exception e) { } tag_suggest = rs.tag_suggest(title, body, "csdn", 5); for (MyTag myTag : tag_suggest) { all.add(insertTagsAndUpdateMongo(tagMap, job, sb, myTag, typeName)); } } else { String tag = job.getString("tag"); if (StringUtil.isNotBlank(tag)) { String[] tags = tag.split(","); for (String string : tags) { if (StringUtil.isNotBlank(string)) { MyTag myTag = new MyTag(string.trim().toLowerCase(), 0, string.length()); all.add(insertTagsAndUpdateMongo(tagMap, job, sb, myTag, typeName)); } } } else { continue; } } if (StringUtil.isNotBlank(sb) && sb.length() > 1) { job.put("tag", sb.subSequence(0, sb.length() - 1)); newObjs.add(job); log.info("insert " + job.getString("tag")); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } try { // 批量保存关联 if (all.size() == 0) { log.info("not have any change to skip! " + ids.substring(0, 10)); return; } if (needSuggestTag && newObjs.size() > 0) { // 批量修改mongo中的tag log.info("update mongo ok" + newObjs.size()); docStoreRemoteService.update(typeName, newObjs); } StringBuilder sb = new StringBuilder("INSERT INTO "); sb.append(tagsManageService.getTableName(typeName)); ObjTag objTag = null; sb.append(" (tag_id,object_id,created_at,channel_id) values "); for (int i = 0; i < all.size(); i++) { objTag = all.get(i); sb.append("("); sb.append(objTag.getTag_id()); sb.append(","); sb.append(objTag.getObject_id()); sb.append(","); sb.append(objTag.getCreated_at()); sb.append(","); sb.append(objTag.getChannel_id()); if (i == all.size() - 1) { sb.append(");"); } else { sb.append("),"); } } tagsManageService.execute(sb.toString()); log.info("batchSave mysql ok" + all.size()); } catch (Exception e) { // TODO Auto-generated catch block log.error("batchSave mysql error" + ids); e.printStackTrace(); } } private ObjTag insertTagsAndUpdateMongo(HashMap<String, Integer> tagMap, JSONObject job, StringBuilder sb, MyTag myTag, String type) throws InstantiationException, IllegalAccessException { sb.append(myTag.getName() + ","); Integer tagId = tagMap.get(myTag.getName()); // 如果不在hash表中就查数据库 if (tagId == null) { Tag tag = tagsManageService.findTagByName(myTag.getName()); // 如果为空就插入一个 if (tag == null) { tag = new Tag(); tag.setName(myTag.getName()); tagsManageService.saveTag(tag); } // 设置到map中 tagMap.put(tag.getName(), tag.getId()); tagId = tag.getId(); } // 插入一条记录到数据库中 ObjTag objTag = new ObjTag(); objTag.setObject_id(job.getInt("id")); objTag.setTag_id(tagId); objTag.setCreated_at(job.getLong("created_at")); try { objTag.setChannel_id(job.getInt("channel_id")); } catch (Exception e) { objTag.setChannel_id(-1); log.error("channel get error!"); } return objTag; } }