mongoDB的使用(CURD)以及结合分词的操作
最近参与公司的IM聊天功能的开发,聊天记录都存在了mongo里,这就要求对MongoDB使用要熟练,由于自己平时使用mongo少,只会简单的操作,正好现在有时间系统的学习下。
一、ansj分词的使用
聊天内容要分词之后入库,因为这查询聊天记录的时候会非常的快和准确,我们使用的是ansj分词器
ansj是一个基于n-Gram+CRF+HMM的中文分词的java实现.
ansj分词速度达到每秒钟大约200万字左右(mac air下测试),准确率能达到96%以上
ansj目前实现了.中文分词.词性识别. 中文姓名识别 . 用户自定义词典,关键字提取,自动摘要,关键字标记等功能
可以应用到自然语言处理等方面,适用于对分词效果要求高的各种项目.
github主页:https://github.com/ansjsun/ansj_seg/
官方文档:http://nlpchina.github.io/ansj_seg/
二、使用
只粘贴了核心代码
@Service
public class IUserServiceImpl implements IUser {
@Autowired
private MongoTemplate mongoTemplate;
@Resource
private IndexAnalysis indexAnalysis;
@Autowired
private ToAnalysis toAnalysis;
/**
* 先分词,再插入操作
*
* @param map
*/
@Override
public void insert(Map map) {
String id = map.get("id").toString();
String name = map.get("name").toString();
Integer age = (Integer) map.get("age");
Map contentMap = (Map) map.get("content");
String jsonString = JSON.toJSONString(contentMap);
JSONObject jsonObject = JSON.parseObject(jsonString);
UserMongo user = new UserMongo();
user.setId(id);
user.setName(name);
user.setAge(age);
user.setContent(jsonObject);
setSearchText(user);
mongoTemplate.insert(user);
}
/**
* 查询全部
*
* @return
*/
@Override
public List<UserMongo> findAll() {
return mongoTemplate.findAll(UserMongo.class);
}
/**
* 按条件查询
*
* @param map
* @return
*/
@Override
public List<UserMongo> findByConditions(Map map) {
// 单个查询
// Query query=new Query(Criteria.where("name").is(name));
// User user = mongoTemplate.findOne(query , User.class);
// return user;
Query query = new Query();
query.skip(1); // 页数
query.limit(2); // 每页显示条数
Sort sort = new Sort(Sort.Direction.DESC, "id");
query.with(sort);
query.addCriteria(Criteria.where("name").is(map.get("name").toString()));
List<UserMongo> list = mongoTemplate.find(query, UserMongo.class);
return list;
}
/**
* 文本分词查询
*
* @param map
* @return
*/
@Override
public List<UserMongo> textSearch(Map map) {
Query query = new Query();
String analysisedContent = toAnalysis.parseStr(map.get("content").toString()).toStringWithOutNature(" ");
System.out.println(analysisedContent);
query.addCriteria((new TextCriteria()).matching(analysisedContent));
List<UserMongo> userMongoList = mongoTemplate.find(query, UserMongo.class, "userMongo");
System.out.println(userMongoList);
return userMongoList;
}
/**
* 更新
*
* @param map
* @return
*/
@Override
public boolean update(Map map) {
Query query = new Query(Criteria.where("id").is(map.get("id")));
Update update = new Update().set("name", map.get("name")).set("age", map.get("age"));
// 更新查询返回结果集的第一条
// mongoTemplate.updateFirst(query, update, UserMongo.class);
// 更新查询返回结果集的所有
mongoTemplate.updateMulti(query, update, UserMongo.class);
return true;
}
/**
* 删除
*
* @param map
* @return
*/
@Override
public boolean delete(Map map) {
Query query = new Query(Criteria.where("id").is(map.get("id")));
mongoTemplate.remove(query, UserMongo.class);
return true;
}
/**
* 设置全文索引内容
*/
private void setSearchText(UserMongo userMongo) {
String content = userMongo.getContent().getString("content");
String analysisedContent = indexAnalysis.parseStr(content).toStringWithOutNature(" ");
System.out.println(analysisedContent);
userMongo.setText(analysisedContent);
}
}
项目git地址:https://github.com/c-qi/mongo