solr 批量删除

前言:公司项目需要删除过期数据,数据在solr中。
这里使用的solrj版本是 5.5.3
最初的实现方式是查询过期数据,返回指定域为id,将id添加到一个listID集合,通过deleteById来删除。代码如下:
//设置删除时间为当前日期并转换成时间戳,不包含今天
            long deleteTime = new Date().getTime()/1000-86400;
            //添加查询,查询当前日期之前的item结束时间
            SolrQuery query = new SolrQuery("itemId_end_time:[* TO "+deleteTime+"]");
            //指定返回域是id
            query.addField("id");
            //提交查询
            QueryResponse response = serverClient.query(query);
            //获取返回的结果集,默认返回集是SolrDocumentList
            SolrDocumentList list = response.getResults();
            //for循环添加id到list,好用于下一步提交删除用
            for (SolrDocument listId: list){
                listIds.add(listId.get("id"));
            }
                if(listIds.size()!=0){
                    serverClient.deleteById(listIds);
                    //提交修改
                    serverClient.commit();
                    serverClient.close();
                }

将该方法放到定时器中,每天晚上12点过1分执行。

过了一段时间之后发现过期数据任然很多,大概几万条。
随后发现思路没有问题,但是solr查询的返回值有问题,一次只有10条数据。
小数据测试的时候没发现这个问题,数据量大了之后就凸出了。
进一步改进:
在提交查询之前,设置显示条数:
query.setRows(100);

具体上限没详细测试,反正我填10万能返回10万条。

问题虽然貌似解决了,但是还可以进一步优化。
那就是deleteByQuery()方法。直接在solr上就删除了, 不用取值啊,传值啊这么麻烦。

根据查询结果来删除

代码如下:
UpdateResponse updateResponse = serverClient.deleteByQuery("itemId_end_time:[* TO "+deleteTime+"]");
serverClient.commit();


千万记得commit不提交不生效。记得捕获异常......
另外,查询的返回结果有显示条数。
//index用于记录处理了多少条数据
long index = 0;
QueryResponse response = serverClient.query(query);
index = response.getResults().getNumFound();


最后,求个solrj 的api啊啊啊啊啊啊啊啊...........

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值