天天看點

五分鐘帶你玩轉Elasticsearch(二十)es導出時間段内的資料

Elasticsearch

導出兩個時間段内.monitoring-logstash-7-*索引的資料 儲存在text上

@ApiOperation(value = "導出詳細日志接口", notes = "導出詳細日志接口")
    @PostMapping("/exportDetailLog")
    public void exportDetailLog(@ApiParam(name = "導出詳細日志接口輸入參數實體", value = "導出詳細日志接口輸入參數實體",
        required = false) @RequestBody HandleDetailLogVO handleDetailLogVO) throws IOException, ParseException {
        SimpleDateFormat sd = new SimpleDateFormat(DateFormatEnum.YYYY_MM_DD_HH_MM_SS.getFormat());
        String beginTime = handleDetailLogVO.getBeginTime() + DateFormatEnum.BEGIN_HH_MM_SS.getFormat();
        String endTime = handleDetailLogVO.getEndTime() + DateFormatEnum.END_HH_MM_SS.getFormat();
        String path = handleDetailLogVO.getPath() + "/" + handleDetailLogVO.getBeginTime() + "-"
            + handleDetailLogVO.getEndTime() + ".txt";
        // 根據時間查詢
        NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
        BoolQueryBuilder bool = QueryBuilders.boolQuery();
        List<QueryBuilder> filters = bool.filter();
        filters.add(QueryBuilders.rangeQuery("time").gte(sd.parse(beginTime)).lte(sd.parse(endTime)));
        builder.withQuery(bool);
        NativeSearchQuery query = builder.build();
        IndexCoordinates indexCoordinates = IndexCoordinates.of(".monitoring-logstash-7-*");
        // 查詢前1w條
        SearchScrollHits<DetailLogVO> scroll =
            elasticsearchTemplate.searchScrollStart(3000, query, DetailLogVO.class, indexCoordinates);
        List<SearchHit<DetailLogVO>> resultList = new ArrayList<>();
        while (scroll.hasSearchHits()) {
            List<SearchHit<DetailLogVO>> searchHitList = scroll.getSearchHits();
            resultList.addAll(searchHitList);
            scroll = elasticsearchTemplate.searchScrollContinue(scroll.getScrollId(), 3000, DetailLogVO.class,
                indexCoordinates);
        }
        // 導出為text
        Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path, true), "utf-8"));
        for (int i = 0; i < resultList.size(); i++) {
            out.write(resultList.get(i).getContent().getMessage());
            out.write("\r\n");
        }
        out.flush();
        out.close();
        // 删除索引
        elasticsearchTemplate.delete(query, DetailLogVO.class, indexCoordinates);
    }      

實體

public class HandleDetailLogVO {
 
    /**
     * 結束時間
     */
    @ApiModelProperty(value = "結束時間", name = "結束時間")
    private String endTime;
 
    /**
     * 開始時間
     */
    @ApiModelProperty(value = "開始時間", name = "開始時間")
    private String beginTime;
 
    /**
     * 導出路徑
     */
    @ApiModelProperty(value = "導出路徑", name = "導出路徑")
    private String path;
}      

繼續閱讀