springboot整合solr定时更新索引(代码实现)

本文介绍了一种使用SpringBoot定时器进行Solr索引更新的方法,包括定时删除全部索引并重新从数据库导入数据的过程,以及如何通过Solr进行高效查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       solr索引更新可以有三中方式,一种是实时更新(网上一找一大堆,在这里不解释),还有两种定时更新,这两种定时更新一种是基于注解的  还有一种我是用到了springboot的定时器(定时区索引库删除全部缓存索引  然后再去数据库查)

 

 

因为我们使前后台分成两个项目做得  所以这块我用的是定时更新索引的方法   基于配置的大多需要下载apache-solr-dataimportscheduler-1.0.jar的jar包然而这个jar包有许多的坑所以放弃自己写一个定时的   至于springboot的定时器其实俩注解

       


   /*
    *
    * 定时器
    * */
   //cron代表的是时间  如下代表(23点59分59秒)
    @Scheduled(cron = "59 59 23 * * ?")
    public void timer() throws Exception{
        //获取当前时间
        LocalDateTime localDateTime =LocalDateTime.now();
        //输出当前时间
        System.out.println("当前时间为:" +                         
        localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        //调用删除索引的方法
        deleteDocument();
        Thread.sleep(5000);
        //调用数据新增到索影库的方法
        selectGoods();
    }
//首先你得注入solr
 @Autowired
    private SolrClient solrClient;

 /*
     * 从索引库删除文档
     */
    public void deleteDocument() throws Exception {
        
        //删除所有的索引
        solrClient.deleteByQuery("*:*");
        //提交修改
        solrClient.commit();
        System.out.println("成功了");
    }
//将数据库查到的数据放入solr库

 public void selectGoods() throws Exception {
        //先去数据库查数据
        List<Goods> list = searchService.selecGoods();
        循环遍历查询
        for (Goods items : list) {
            SolrInputDocument document = new SolrInputDocument();
            //创建文档对象
            //添加域
            System.out.println(items);
            document.addField("id",items.getGoods_id().toString());
            document.addField("goods_id", items.getGoods_id().toString());
            document.addField("goods_title", items.getGoods_title());
            document.addField("vigour_value", items.getVigour_value());
            document.addField("price", items.getPrice());
            document.addField("performance", items.getPerformance());
            document.addField("growth_value", items.getGrowth_value());
            document.addField("introduce", items.getIntroduce());
            document.addField("img_url", items.getImg_url());
            //写入
            // System.out.println(document);
            solrClient.add(document);
           }
         //提交
        solrClient.commit();
        System.out.println("我也成功了");
    }

  solr查询

@Override
    public List<Goods> getgoodlist(String goods_title) throws IOException, SolrServerException {
        List<Goods> listtt=new ArrayList<>();
        SolrQuery params = new SolrQuery();
        if(goods_title != null){
            //  q  代表查询的关键字    代表如果title不为空   就拼title条件去查询
            params.set("q", goods_title);
        }else{
            //   为空则去查询所有
            params.set("q", "*:*");
        }
        //排序
         // params.addSort("goods_id", SolrQuery.ORDER.asc);
        params.set("start",0);
        //该参数就是控制条数
        params.set("rows", Integer.MAX_VALUE);
        //分页
        params.setStart(0);
        params.setRows(20);
        // df 代表默认的查询字段
        params.set("df", "product_keywords");
       // params.set("df","introduce");
        //   指的是你查询完毕之后要返回的字段
        params.set("fl", "goods_title,introduce,vigour_value,growth_value,price,goods_id,performance,img_url");
        //高亮
        //打开开关
        params.setHighlight(false);
       // params.set("fl","goods_title");
        params.addHighlightField("introduce"); // 高亮字段

        //设置前缀
        params.setHighlightSimplePre("<font color=\"red\">");
        //设置后缀
        params.setHighlightSimplePost("</font>");
        //   System.out.println("----------------------------"+params);
        QueryResponse queryResponse = solrClient.query(params);
        SolrDocumentList results = queryResponse.getResults();
        long numFound = results.getNumFound();
//        System.out.println(numFound);
        Map<String, Map<String, List<String>>> highlight = queryResponse.getHighlighting();
        int i=0;
        for (SolrDocument result : results) {
            Goods goods=new Goods();
            String highname="";
            Map<String, List<String>> map = highlight.get(result.get("goods_id"));
            List<String> list = map.get(result.get("goods_title"));
            if(list==null){
                highname=(String)result.get("goods_title");
            }else{
                highname=list.get(i);
            }
            goods.setGoods_id((String) result.get("goods_id"));
            //   System.out.println("questionscontet---------------"+(String)result.get("goods_title"));
            goods.setGoods_title((String)result.get("goods_title"));
            goods.setIntroduce((String) result.get("introduce"));
            goods.setVigour_value((Double) result.get("vigour_value"));
            goods.setGrowth_value((Integer) result.get("growth_value"));
            goods.setPrice((Double)result.get("price"));
            goods.setPerformance((Double) result.get("performance"));
            goods.setImg_url((String) result.get("img_url"));
            listtt.add(goods);
            i++;
        }
        return listtt;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值