2017-02-02 7 views
0
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 출력을 얻어야합니다.딥 페이지 매김을 사용하는 NamedList

나는 아래의 방법으로 결과를 가져 오려고 노력했다. 위의 코드에서 출력

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")); 

는 javabin로서 중량있다. 그래서 나는 CSV 출력을 얻을 수 없다.

제안 사항?

답변

0

두 가지 방법이 있습니다.

  1. 사용 SOLR export 의뢰처 (또는 추가) 및 파라미터 wt=csv. 이 메시지는 보통 이전 Solr 버전에서도 사용할 수있는 Implicit Request Handler이며 수백만 개의 레코드를 내보내는 시나리오를 처리하도록 특별히 설계되었습니다.

  2. 은 딥 페이징을 올바르게 구현합니다. 나는 Yonic 포스트 paging and deep paging를 제안한다, 당신 생각보다 쉽다. 그러나 올바르게 구현 한 후에는 직접 csv 파일을 만들어야합니다. 내가 찾은

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. 여러 항목을 해결하면 비용이 많이 들지 않습니다.

단점 :

  1. 결과는 유일하지 않다는 의미 당신이 가져 오는 무엇을 기준으로 데이터가 반복 될 수있다.

독특한 결과를 얻으려면 패싯을 사용할 수 있습니다.

감사합니다.