2016-07-12 3 views
0

ElasticSearch内のすべてのデータをエクスポートし、それらのデータをすべて再作成する必要があります。すべてのElasticSearchデータをJSONファイルにエクスポート

エクスポートJavaコードは次のとおりです。

SearchResponse response = client.prepareSearch("news") 
       .setTypes("news_data") 
       .setQuery(QueryBuilders.matchAllQuery()) 
       .setSize(1000) 
       .setScroll(new TimeValue(600000)) 
       .setSearchType(SearchType.SCAN) 
       .execute().actionGet(); 
     String scrollid = response.getScrollId(); 
     try { 
      //把导出的结果以JSON的格式写到文件里 
      BufferedWriter out = new BufferedWriter(new FileWriter("es", true)); 

      while (true) { 
       SearchResponse response2 = client.prepareSearchScroll(scrollid) 
         .setScroll(new TimeValue(1000000)) 
         .execute().actionGet(); 
       SearchHits searchHit = response2.getHits(); 
       //再次查询不到数据时跳出循环 
       if (searchHit.getHits().length == 0) { 
        break; 
       } 
       System.out.println("查询数量 :" + searchHit.getHits().length); 
       for (int i = 0; i < searchHit.getHits().length; i++) { 
        String json = searchHit.getHits()[i].getSourceAsString(); 
        out.write(json); 
        out.write("\r\n"); 
       } 
      } 
      System.out.println("查询结束"); 
      out.close(); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

文書数は約140Wです。このJavaコードを使用して、60Wの文書をエクスポートして例外をスローすることができます。

远程主机强迫关闭了一个现有的连接 
+0

まず、whileループ内のscrollidを更新する必要があります。 https://www.elastic.co/guide/en/elasticsearch/reference/1.7/search-request-scroll.html#scroll-scan '最初の検索要求とその後の各スクロール要求は、新しい_scroll_idを返します - 最新の_scroll_idのみを使用する必要があります。 ' 2番目..すべてのメッセージに対してFileWriterを開いたままにして、アプリケーションが消費するメモリ量を確認できません。おそらく、いくつかのファイルを書いて、スクロールリクエストを閉じる方が良いでしょう。 – phuc77

答えて

0

次回のリクエストでは、前の応答からスクロールIDを使用する必要があります。

おそらく、あなたの代わりにこのような何かを試すことができますか?詳細

ためhttps://www.elastic.co/guide/en/elasticsearch/reference/1.7/search-request-scroll.html#scroll-scanを参照してください。

SearchResponse response = client.prepareSearch("news") 
      .setTypes("news_data") 
      .setQuery(QueryBuilders.matchAllQuery()) 
      .setSize(1000) 
      .setScroll(new TimeValue(600000)) 
      .setSearchType(SearchType.SCAN) 
      .execute().actionGet(); 
    int sequence = 0; 
    do 
    { 
     response = client.prepareSearchScroll(response.getScrollId()) 
       .setScroll(new TimeValue(600000)) 
       .execute().actionGet(); 
     if (response.getHits().getHits().length > 0) 
     { 
      try 
      { 
       final BufferedWriter out = new BufferedWriter(new FileWriter("es-" + (++sequence) , true)); 
       for (final SearchHit hit : response.getHits().getHits()) 
       { 
        out.write(hit.getSourceAsString()); 
        out.write("\r\n"); 
       } 
       out.close(); 
      } 
      catch (final IOException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 
    while (response.getHits().hits().length > 0); 
関連する問題