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

Last modification:March 25th, 2020 at 11:06 pm