2016-07-12 21 views
0

Ich muss alle Daten in der ElasticSearch exportieren und alle diese Daten neu indizieren.Exportieren Sie alle ElasticSearch-Daten in JSON-Datei

Der Export-Java-Code wie folgt.

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(); 
     } 

Die Anzahl der Dokumente beträgt etwa 140W. Verwenden Sie diesen Java-Code 60W Dokumente können exportiert werden und eine Ausnahme auslösen.

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

Zuerst müssen Sie Ihre Scrollid innerhalb Ihrer While-Schleife aktualisieren. Von https://www.elastic.co/guide/en/elasticsearch/reference/1.7/search-request-scroll.html#scroll-scan 'Die erste Suchanfrage und jede nachfolgende Scroll-Anfrage gibt eine neue _scroll_id zurück - Nur die letzte _scroll_id sollte verwendet werden. Zweite .. nicht sicher, wie viel Speicher Ihre Anwendung verbrauchen wird, mit dem FileWriter für alle Ihre Nachrichten offen bleiben. Vielleicht ist es besser, wenn Sie mehrere Dateien schreiben und zwischen Bildlaufanfragen schließen. – phuc77

Antwort

0

Sie müssen die Scrollid von der vorherigen Antwort für Ihre nächste Anfrage verwenden.

Siehe https://www.elastic.co/guide/en/elasticsearch/reference/1.7/search-request-scroll.html#scroll-scan für weitere Details

Vielleicht haben Sie so etwas wie dieses stattdessen versuchen kann?

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