ElasticSerach+MongoDB:实现文章检索历史功能

这篇具有很好参考价值的文章主要介绍了ElasticSerach+MongoDB:实现文章检索历史功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现目标:

  • 展示用户的搜索记录10条,按照搜索关键词的时间倒序
  • 可以删除搜索记录
  • 保存历史记录,保存10条,多余的则删除最久的历史记录

ElasticSerach+MongoDB:实现文章检索历史功能,mongodb,数据库

数据库的选择:

用户的搜索记录,需要给每一个用户都保存一份,数据量较大,要求加载速度快,通常这样的数据存储到mongodb更合适,不建议直接存储到关系型数据库中。与redis对比,MongoDB是结构化数据,而redis中只有keyValue。

实现思路:

ElasticSerach+MongoDB:实现文章检索历史功能,mongodb,数据库

实现

保存

1. 创建实体类

```java @Data @Document("apusersearch") // mongoDB的映射注解 public class ApUserSearch implements Serializable { private static final long serialVersionUID = 1L;

private Integer userId; private String keyword; private Date createdTime; } ```

2. 保存userSearch

```java @Autowired private MongoTemplate mongoTemplate;

// keyword从dto中获取,userId从线程中获取 @Override public void insert(String keyword, Integer userId){ // 1. 查询当前用户的搜索关键词 Query query = Query.query(Criteria .where("userId").is(userId) .and("keyword").is(keyword)); ApUserSearch apUserSearch = ApUsermongoTemplate.findOne(query, ApUserSearch.class); // 2. 存在,更新创建时间 if(apUserSearch != null) { apUserSerach.setCreatedTime(new Date()); mongoTemplate.save(apUserSearch); return; } // 3. 不存在,判断当前历史总是是否超过10 apUserSearch = new ApUserSearch(); apUserSearch.setUserId(userId); apUserSearch.setKeyWord(keyword); apUserSearch.setCreatedTime(new Date()); // 重新排序 Query query1 = Query.query(Criteria .where("userId").is(userId); query1.with(Sort.by(Sort.Direction.DESC, "createdTime")); List list = mongoTemplate.find(query1, ApUserSearch.class); // 保存历史记录,保存10条,多余的则删除最久的历史记录 if(list == null || list.size() < 10){ mongoTemplate.save(apUserSearch); }else{ ApUserSearch lastInfo = apUserSearchList.get(apUserSearchList.size() - 1); // 替换 mongoTemplate.findAndReplace( Query.query(Criteria.where("id").is(lastInfo.getId()) , apUserSearch); }

} ```

3. 获取当前的用户

拦截器类,继承Ordered,GlobalFilter,其中重写filter方法,获取到了用户信息,存储到了header中,再重置请求

java @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { //1.获取request和response对象 ServerHttpRequest request = exchange.getRequest(); ServerHttpResponse response = exchange.getResponse(); }

实现一个工具类AppThreadLocalUtil在utils的Service服务中,用于获取用户 ```java public class AppThreadLocalUtil {

private final static ThreadLocal<ApUser> WM_USER_THREAD_LOCAL = new ThreadLocal<>();

//存入线程中
public static void setUser(ApUser apUser){
    WM_USER_THREAD_LOCAL.set(apUser);
}

//从线程中获取
public static ApUser getUser(){
    return WM_USER_THREAD_LOCAL.get();
}

//清理
public static void clear(){
    WM_USER_THREAD_LOCAL.remove();
}

} ``` 实现拦截器

```java public class AppTokenInterceptor implements HandlerInterceptor { // 把用户解析放在线程中 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String userId = request.getHeader("userId"); if(userId != null){ //存入到当前线程中 ApUser apUser = new ApUser(); apUser.setId(Integer.valueOf(userId)); AppThreadLocalUtil.setUser(apUser);

}
    return true;
}
// 清理线程
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    AppThreadLocalUtil.clear();
}

} ``` 在config中的WebMvcConfig中配置

java @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AppTokenInterceptor()).addPathPatterns("/**"); } }

4. 最后在ArticleSerachServiceImple中的search函数中添加

java ApUser user = AppThreadLocalUtil.getUser(); if(user != null && dto.getFromIndex() == 0){ // 首页 // 异步调用 保存搜索记录 apUserSearchService.insert(dto.getSearchWords(), user.getId()); }

查询

java List<ApUserSearch> apUserSearches = mongoTemplate.find(Query.query(Criteria.where("userId").is(user.getId())).with(Sort.by(Sort.Direction.DESC, "createdTime")), ApUserSearch.class);

删除

```java //1.检查参数 if(dto.getId() == null){ return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID); }

//2.判断是否登录 ApUser user = AppThreadLocalUtil.getUser(); if(user == null){ return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN); }

//3.删除 mongoTemplate.remove(Query.query(Criteria.where("userId").is(user.getId()).and("id").is(dto.getId())),ApUserSearch.class); return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS); ```文章来源地址https://www.toymoban.com/news/detail-732938.html

到了这里,关于ElasticSerach+MongoDB:实现文章检索历史功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 公众号历史文章采集

    前言:采集公众号历史文章,且链接永久有效,亲测2年多无压力。 1.先在 https://mp.weixin.qq.com/ 注册一个个人版使用公众号,供后续使用。 2.点击左侧图文素材,新的创作,写新图文。 3.点击超链接后,填入要查询的公众号。 4.一个小知识点,通过xpath拿到html源码,并提取正文

    2024年02月16日
    浏览(26)
  • MongoDB Compass当前版本及历史版本下载安装

    官网 https://www.mongodb.com/try/download/compass 官网下载一般只能下载最新版本。 github https://github.com/mongodb-js/compass MongoDB Compass MongoDB 1.9.12 MongoDB 2.6.11 Community

    2024年01月19日
    浏览(33)
  • MongoDB数据库从入门到精通系列文章之:MongoDB数据库百篇技术文章汇总

    MongoDB数据库系列文章持续更新中: 更多数据库内容请阅读博主数据库专栏,数据库专栏涵盖了Mysql、SQLServer、PostgreSQL、MongoDB、Oracle、Cassandra等数据库 数据库专栏 文章名称 文章链接 数据库安装部署系列之:部署Mongodb5.0.6高可用集群详细步骤 数据库安装部署系列之:部署M

    2024年02月11日
    浏览(43)
  • Python爱好者社区历史文章列表(每周append更新一次)

    2月22日更新:   0.Python从零开始系列连载: Python从零开始系列连载(1)——安装环境 Python从零开始系列连载(2)——jupyter的常用操作 Python从零开始系列连载(3)——Python的基本数据类型(上) Python从零开始系列连载(4)——Python的基本数据类型(下) Python从零开始系列

    2024年02月08日
    浏览(33)
  • MongoDB 双机热备那篇文章是 “毒”

    开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis ,Oracle ,Oceanbase 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加微信号 liuaustin3 (共1200人左右 1 + 2 + 3)新人会进入3群 如果没有法律,我可能真想做了这个事情,

    2024年02月10日
    浏览(27)
  • 【黑马头条之app端文章搜索ES-MongoDB】

    本笔记内容为黑马头条项目的app端文章搜索部分 目录 一、今日内容介绍 1、App端搜索-效果图 2、今日内容 二、搭建ElasticSearch环境 1、拉取镜像 2、创建容器 3、配置中文分词器 ik 4、使用postman测试 三、app端文章搜索 1、需求分析 2、思路分析 3、创建索引和映射 4、数据初始化

    2024年02月08日
    浏览(29)
  • ElasticSerach忘记密码,密码重置

    elasticSearch8.5版本加入了Security安全,这样我们第一次启动的时候会在控制台打印出来自动生成的密码,但是我们可能没有保存,后面就不知道密码了。或者我们设置了密码忘记了怎么办? elasticSearch给我们提供了重置密码功能。 首先进入到bin目录,执行如下命令进行密码重置

    2024年02月11日
    浏览(90)
  • 【人工智能】谷歌 Bard 写文章能力测评:人类技术革命的历史—— GPT-4 危险了,论技术看来还是Google牛逼啊

    目录 人类技术革命的历史 第一次技术革命:新石器时代革命 第二次技术革命:工业革命

    2024年02月09日
    浏览(33)
  • 【创作赢红包】ElasticSerach基础概念知识梳理

    目录 ES概念介绍 1、ES核心概念组成 2、ES数据类型介绍 2.1 字符串型 2.2 数值型 2.3 布尔型 boolean 2.4 二进制类型 binary 2.5 范围类型 2.6 日期型 date 2.7 复杂数据类型 3、特点 4、应用场景举例 Ela ticsearch,简称为ES, ES是一个开源的高扩展的分布式全文搜索引擎,是整个Elastic Stack技

    2023年04月26日
    浏览(42)
  • 用springboot+elasticserach7的demo,对比sider和百度ai的异同

    对比aigc引擎:sider chatgpt3.5和百度ai 提示词: springboot2.5,连接elasticsearch7的demo,要有基本的操作,用模板方法 以下是一个使用Spring Boot 2.5连接Elasticsearch 7的示例代码,包括基本的操作方法: 首先,需要在pom.xml文件中添加Elasticsearch的依赖: 然后,创建一个Spring Boot应用程序

    2024年02月09日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包