首页 > 其他分享 >保存搜索记录

保存搜索记录

时间:2023-07-08 18:00:37浏览次数:35  
标签:heima 记录 userId 保存 springframework 搜索 import com public

一、实现思路

输入关键字——》搜索——异步请求——》记录关键字

【异步请求保存关键字,让用户快速看到搜索结果,等待时间更短】

保存——>查询搜索记录——存在——更新到最新时间

            不存在——搜索记录的数量是否超过10——没超过则直接保存,超过则替换最后一条数据即时间最久

 

二、实现步骤

1、搜索微服务集成mongodb

pom依赖

nacos配置

创建对应实体类

 <!--mongoDB-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
server:
  port: 9998
spring:
  data:
    mongodb:
      host: 192.168.200.130
      port: 27017
      database: leadnews-history

2、创建ApUserSearchService新增insert方法

查询当前用户搜索的关键词是否存在

存在则更新最新时间

不存在则新增, 判断当前历史记录是否超过10条记录

package com.heima.search.service.impl;

import com.heima.search.pojos.ApUserSearch;
import com.heima.search.service.ApUserSearchService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;


@Service
@Slf4j
public class ApUserSearchServiceImpl implements ApUserSearchService {
    @Autowired
    private MongoTemplate mongoTemplate;
    
    /**
     * 保存用户搜索历史记录
     *
     * @param keyword
     * @param 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 = mongoTemplate.findOne(query, ApUserSearch.class); //用户搜索信息表
        //2、存在更新创建时间
        if(apUserSearch != null){
            apUserSearch.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<ApUserSearch> apUserSearches = mongoTemplate.find(query1, ApUserSearch.class);
        
        if(apUserSearches == null || apUserSearches.size() < 10){
            mongoTemplate.save(apUserSearch);
        }else{
            ApUserSearch lastUserSearch = apUserSearches.get(apUserSearches.size() - 1);
            mongoTemplate.findAndReplace(Query.query(Criteria.where("id").is(lastUserSearch.getId())), apUserSearch);
        }


    }
}

 

3、参考自媒体相关微服务,在搜索微服务中获取当前登录的用户【ThreadLocal、Interceptor】

在app网关中把用户id存入header

//获取用户信息
            Object userId = claimsBody.get("id");

            //存入header
            ServerHttpRequest serverHttpRequest = request.mutate().headers(httpHeaders -> {
                httpHeaders.add("userId", userId + "");
            }).build();
            //重置请求
            exchange.mutate().request(serverHttpRequest);

 在interceptor中获取id存在Threadlocal

package com.heima.utils.common.thread;

import com.heima.model.user.pojos.ApUser;
import com.heima.model.wemedia.pojos.WmUser;

public class AppThreadLocalUtil {
    public 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();
    }
}
package com.heima.search.interceptor;

import com.heima.model.user.pojos.ApUser;
import com.heima.model.wemedia.pojos.WmUser;
import com.heima.utils.common.thread.AppThreadLocalUtil;
import com.heima.utils.common.thread.WmThreadLocalUtil;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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();
    }
}
package com.heima.search.config;

import com.heima.search.interceptor.AppTokenInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AppTokenInterceptor()).addPathPatterns("/**");
    }
}

 
4、在ArticleSearchService的search方法中调用保存历史记录

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

 

5、保存历史记录中开启异步调用,添加注解@Async

6、在搜索微服务引导类上开启异步调用

7.测试,搜索后查看结果

 

标签:heima,记录,userId,保存,springframework,搜索,import,com,public
From: https://www.cnblogs.com/fxzm/p/17536168.html

相关文章

  • 记录一次Doris的BE启动失败的问题
    启动be的时候出现jobaborted;查看日志be.WARNNING,发现有下面的bug,W070801:33:16.1233979919cidr.cpp:75]wrongCIDRIPvalue.network=F070801:33:16.1234629919backend_options.cpp:96]wrongcidrformat.cidr_str=W070801:37:21.44462410501cidr.cpp:75]......
  • .net core 6.0 mvc js对文件分片上传文件+控制器合并文件保存
    js,通过ajax将文件分片提交  遇到问题:.netcore6.0mvc上传文件位置主文件夹下的\bin\Debug\net6.0 文件访问不了问题在startup配置#region让upload文件夹可以外部访问stringsUploadPath="/upload";stringsFDir=ToolsBasic.UsPath(sUploadPath);if(!Direc......
  • 爬天梯 + 放苹果 (记忆化搜索大大优化时间复杂度)
    记忆化搜索——即把搜过的地方记录下来,后面再搜的时候直接取就好了 题解:1#include<iostream>2usingnamespacestd;3#definelllonglong4constintN=100;5lla[N],n;6lldfs(lln)7{8if(n<=1)9return1;1011if(!a......
  • <折半搜索>题型总结
    折半搜索meetinthemiddle算法(又叫splitandmerge算法)顾名思义这种算法就是同时从两个点往中间搜索,直到碰头为止而使等式两边未知数个数相等或尽量均匀分布是用meetinthemiddle算法解决等式问题的常见方法SP4580ABCDEF题目描述给定一个集合S(元素个数100以内)求......
  • (MySQL)从本地导入1000w的记录表
    ERROR1148(42000):TheusedcommandisnotallowedwiththisMySQLversionSHOWVARIABLESLIKE'local_infile';修改/etc/my.iniloose-local-infile=1使用setglobalmysql-uroot-pEnterpassword:[输入密码]SETGLOBALlocal_infile=1;配置完毕之......
  • 记录Unity2021接入穿山甲SDK的几个问题
    Unity2021接入穿山甲SDK,打包一直有报错,费了不少心力,查了N多帖子(绝大部分没什么用),特别感谢ChatGPT提供的线索,最终打包成功,记录几个遇到的问题1、导入最新版本的ExternalDependencyManager,在Github下载源码:https://github.com/googlesamples/unity-jar-resolver;2、ExternalDepend......
  • 百转千回!记一次MySQL主从同步异常的排查记录
    一、现象最近项目的测试环境遇到一个主备同步的问题:备库的同步线程停止了,无法同步主库的数据更改。备库报错如下:从库同步报错信息完整的错误信息:Relaylogreadfailure:Couldnotparserelaylogevententry.Thepossiblereasonsare:themaster'sbinarylogis......
  • 【项目实战功能】自定义注解实现代码的执行耗时记录
    博主介绍:✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,阿里云专家博主,华为云云享专家✌......
  • NLP应用 | 保存checkpoint模型
    需求描述:当我们训练模型的时候,我们要训练很多训练步数,我们想要保存训练到一定阶段的checkpoint模型参数,并把这些checkpoint模型保存到一个指定的文件夹下。在文件夹下我们最多保存keep_checkpoint_max个checkpoint模型的文件。保存到output文件夹下。每save_checkpoint_steps步去......
  • app端——搜索记录mongoDB
    一、需求说明展示用户的搜索记录10条,按照搜索关键词的时间倒序可以删除搜索记录保存历史记录,保存10条,多余的则删除最久的历史记录二、数据存储说明用户的搜索记录,需要给每一个用户都保存一份,数据量较大,要求加载速度快,通常这样的数据存储到mongodb更合适,不建议直接存储到关系......