2015-03-31 103 views
0

我想在solr中爲數據導入形成一個查詢,但無法這樣做。我無法在Solr中建立查詢

我需要形成以下查詢: http://salsa23q-XXX-08.XXX.XXX.com:8080/solr/#/geoloc_replica1/dataimport/?command=full-import&clean=true

的代碼我想:

public class SolrJDB 
{ 
    public static String url = "http://salsa23q-XXX-08.XXX.XXX.com:8080/solr:8080/solr"; 
    public static SolrServer localserver; 
    public static CloudSolrServer cloudserver;// = new CloudSolrServer("url"); 
    public static SolrQuery que; 
    public static SolrInputDocument doc; 
    public static SolrDocumentList list; 
    public static QueryResponse response; 

    public static String serverurl = "http://salsa23q-XXX-08.XXX.XXX.com:8080/solr"; 

public static void main(String[] args) throws MalformedURLException, SQLException, SolrServerException { 
     try{ 
      System.out.println("+++++++++++++  Starting here  +++++++++++++++++++++"); 
      //Cloud Server 
      String url = "salsa23q-XXX-08.XXX.XXX.com:8080/solr"; 
      cloudserver = new CloudSolrServer(url); 
      SolrQuery parameters = new SolrQuery(); 
      parameters.set("qt","/geoloc_replica1"); 
      parameters.set("qt","//dataimport"); 
      parameters.set("command","full-import"); 
      System.out.println("Query to be Executed ============"+parameters.toString()); 
      QueryResponse response = cloudserver.query(parameters); 
      SolrDocumentList list = response.getResults(); 
     } 
     catch(SolrServerException e){ 
      System.out.println(e.toString()); 
      e.printStackTrace(); 
     } 
     catch(Exception e){ 
      System.out.println(e.toString()); 
      e.printStackTrace(); 
     } 
    } 
} 


I am getting following error: 

    org.apache.solr.client.solrj.SolrServerException: Error executing query 
     at org.apache.solr.client.solrj.request.QueryRequest.process(QueryRequest.java:98) 
     at org.apache.solr.client.solrj.SolrServer.query(SolrServer.java:301) 
     at SolrJDB.main(SolrJDB.java:37) 
    Caused by: java.lang.RuntimeException 
     at org.apache.solr.common.cloud.SolrZkClient.<init>(SolrZkClient.java:115) 
     at org.apache.solr.common.cloud.SolrZkClient.<init>(SolrZkClient.java:83) 
     at org.apache.solr.common.cloud.ZkStateReader.<init>(ZkStateReader.java:138) 
     at org.apache.solr.client.solrj.impl.CloudSolrServer.connect(CloudSolrServer.java:140) 
     at org.apache.solr.client.solrj.impl.CloudSolrServer.request(CloudSolrServer.java:165) 
     at org.apache.solr.client.solrj.request.QueryRequest.process(QueryRequest.java:90) 
     ... 2 more 

回答

0

你在你的代碼的東西混合起來。你想要執行一個運行DataImportHandler的請求。但是你正在構建一個SolrQuery。後者代表一個搜索請求。

通過Java API運行DataImportHandler所需的是UpdateRequest

public int runDataImportHandler() throws Exception { 

    // fill in the parameters you want to run your import with 
    ModifiableSolrParams tmpParams = new ModifiableSolrParams(); 
    tmpParams.set("command", "full-import"); 
    tmpParams.set("clean", true); 
    tmpParams.set("commit", true); 
    tmpParams.set("optimize", true); 

    // create the update request 
    UpdateRequest tmpRequest = new UpdateRequest("/dataimport"); 
    tmpRequest.setParams(tmpParams); 

    SolrServer tmpServer = getServer(); 
    tmpRequest.process(tmpServer); 

    ModifiableSolrParams tmpStatusParams = new ModifiableSolrParams(); 
    tmpStatusParams.set("command", "status"); 
    String tmpStatus = "busy"; 
    int tmpProcessed = 0; 
    do { 
     System.out.println("waiting for import to finish, status was " + tmpStatus); 
     Thread.sleep(500); 

     UpdateRequest tmpStatusRequest = new UpdateRequest("/dataimport"); 
     tmpStatusRequest.setParams(tmpStatusParams); 
     UpdateResponse tmpStatusResponse = tmpStatusRequest.process(tmpServer); 
     tmpStatus = tmpStatusResponse.getResponse().get("status").toString(); 

     Map tmpMessages = (Map) tmpStatusResponse.getResponse().get("statusMessages"); 
     System.out.println("import status is " + tmpStatus); 
     if (tmpMessages.get("Total Documents Processed") != null) { 
      tmpProcessed = Integer.valueOf(tmpMessages.get("Total Documents Processed").toString()); 
     } 
    } while ("busy".equals(tmpStatus)); 

    System.out.println("import done"); 

    return tmpProcessed; 
} 
0

,我可以看到你的代碼中的異常有關創建方式CloudSolrServer例如: -

爲了CloudSolrServer的情況下,你需要有Solr的雲模式,在這裏使用的將是動物園管理員的URL地址。 CloudSolrServer創建zkStateReader,它獲取它查詢的活動節點和集合。

以下是你將如何爲dataimport來創建代碼的確切方式: -

public static void main(String[] args) throws SolrServerException, IOException { 

    ModifiableSolrParams params = new ModifiableSolrParams(); 
    params.set(UpdateParams.COLLECTION, "collection1"); 
    params.set(CommonParams.QT, "/dataimport"); 
    params.set("command", "full-import"); 
    params.set("claen", true); 
    params.set(UpdateParams.COMMIT, true); 
    params.set(UpdateParams.OPTIMIZE, true); 
    String url = "localhost:9983"; /*Zookeeper Address*/ 
    CloudSolrServer cloudserver = new CloudSolrServer(url, true); 
    cloudserver.setDefaultCollection("test");/*This is necessary in case if you are not specifying any collection name in dataimport*/ 
    cloudserver.query(params); 
}