前言:公司项目需要删除过期数据,数据在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啊啊啊啊啊啊啊啊...........