欢迎投稿

今日深度:

solr 批量删除,

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啊啊啊啊啊啊啊啊...........

www.htsjk.Com true http://www.htsjk.com/solr/36239.html NewsArticle solr 批量删除, 前言:公司项目需要删除过期数据,数据在solr中。 这里使用的solrj版本是 5.5.3 最初的实现方式是查询过期数据,返回指定域为id,将id添加到一个listID集合,通过delete...
相关文章
    暂无相关文章
评论暂时关闭