2016-06-07 2 views
2

Java API를 사용하여 Elasticsearch에서 모든 레코드를 가져 오려고합니다. 하지만 아래 오류 메시지가 나타납니다.Java API를 사용하여 Elasticsearch에서 모든 레코드 얻기

n [색인] [데이터 :/읽기/검색] [위상/dfs]]]; 중첩 된 : QueryPhaseExecutionException [결과 창이 너무 커서 + 크기가 [10000]보다 작거나 같아야하며 [10101]이어야합니다.

내 코드는 현재 존재하는 131,881 기록

Client client; 
try { 
    client = TransportClient.builder().build(). 
      addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); 
    int from = 1; 
    int to = 100; 
    while (from <= 131881) { 
     SearchResponse response = client 
       .prepareSearch("demo_risk_data") 
       .setSearchType(SearchType.DFS_QUERY_THEN_FETCH).setFrom(from) 
       .setQuery(QueryBuilders.boolQuery().mustNot(QueryBuilders.termQuery("user_agent", ""))) 
       .setSize(to).setExplain(true).execute().actionGet(); 
     if (response.getHits().getHits().length > 0) { 
      for (SearchHit searchData : response.getHits().getHits()) { 
       JSONObject value = new JSONObject(searchData.getSource()); 
       System.out.println(value.toString()); 
      } 
     } 
    } 
} 

총 수 아래로, 그래서 from <= 131881까지 100 개 개의 레코드를 얻을 다음 from = 1to = 100와 함께 시작합니다. 내가 Elasticsearch에 더 이상의 레코드가 없을 때까지 100 번을 말하면서 레코드를 확인하는 방법이 있습니까?

답변

4

예, scroll API (Java 클라이언트 also supports)을 사용하면됩니다.

당신은 이런 식으로 작업을 수행 할 수 있습니다

Client client; 
try { 
    client = TransportClient.builder().build(). 
      addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300)); 

    QueryBuilder qb = QueryBuilders.boolQuery().mustNot(QueryBuilders.termQuery("user_agent", "")); 
    SearchResponse scrollResp = client.prepareSearch("demo_risk_data") 
     .addSort(SortParseElement.DOC_FIELD_NAME, SortOrder.ASC) 
     .setScroll(new TimeValue(60000)) 
     .setQuery(qb) 
     .setSize(100).execute().actionGet(); 

    //Scroll until no hits are returned 
    while (true) { 
     //Break condition: No hits are returned 
     if (scrollResp.getHits().getHits().length == 0) { 
      break; 
     } 

     // otherwise read results 
     for (SearchHit hit : scrollResp.getHits().getHits()) { 
      JSONObject value = new JSONObject(searchData.getSource()); 
      System.out.println(value.toString()); 
     } 

     // prepare next query 
     scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet(); 
    } 
} 
+0

완벽한, 정말 감사합니다 –

관련 문제