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啊啊啊啊啊啊啊啊...........
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。