具有深度分页的NamedList

时间:2017-02-02 19:10:07

标签: csv solr pagination

QueryRequest req=new QueryRequest(solrQuery);
NoOpResponseParser responseParser = new NoOpResponseParser();
responseParser.setWriterType("csv");
searcherServer.setParser(responseParser);
NamedList<Object> resp=searcherServer.request(req);
QueryResponse res = searcherServer.query(solrQuery);
responseString = (String)resp.get("response");

我使用上面的代码以CSV格式获取输出。我想要获取的数据是巨大的(数十亿)。所以我想包括SOLR的深度分页并获得大量的CSV输出。有办法吗?此外,使用当前版本的SOLR(我无法升级),我必须使用上面的代码来获取CSV输出。

我尝试了以下方法来获取结果。

searcherServer = new HttpSolrServer(url);
SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery(query);
solrQuery.set("fl","field1");
solrQuery.setParam("wt", "csv");
solrQuery.setStart(0);
solrQuery.setRows(1000);
solrQuery.setSort(SolrQuery.SortClause.asc("field2"));

在上面代码的输出中有wt为javabin。所以我无法获得CSV输出。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

你有两种方式。

  1. 使用Solr export请求处理程序(或添加它)和wt=csv参数。需要明确的是,即使在较旧的Solr版本中,这也是Implicit Request Handler通常可用的,专门用于处理涉及导出数百万条记录的场景。

  2. 正确实现深度分页。我建议Yonic发帖paging and deep paging,比你想象的要容易。但是,在您正确实施之后,您还需要自己创建csv文件。

答案 1 :(得分:0)

我找到的解决方案是:

SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery(query); //what you want to fetch
QueryResponse res = searcherServer.query(solrQuery);
int numFound = (int)res.getResults().getNumFound();
int rowsToBeFetched = (numFound > 1000 ? (int)(numFound/6) : numFound);
for(int i=0; i< numFound; i=i+rowsToBeFetched ){
 solrQuery.set("fl","fieldToBeFetched");
 solrQuery.setParam("wt", "csv");
 solrQuery.setStart(i);
 solrQuery.setRows(rowsToBeFetched);
 QueryRequest req=new QueryRequest(solrQuery);
 NoOpResponseParser responseParser = new NoOpResponseParser();
 responseParser.setWriterType("csv");
 searcherServer.setParser(responseParser);
 NamedList<Object> resp=searcherServer.request(req);
 responseString = (String)resp.get("response"); //This is in CSV format
}

优点:

  1. 由于我没有立即得到结果,所以速度更快。
  2. 输出为csv。
  3. 击中多件物品并不昂贵。
  4. 缺点:

    1. 结果不是唯一的,这意味着可以根据您提取的内容重复数据。
    2. 要获得独特的结果,您可以使用构面。

      谢谢!