elasticsearch scroll拉取符合条件的全部数据(java代码)

		// 过滤字段
		String[] dayKSimpleFields = this.getDayKSimpleFields();
		//基本的Query条件
		BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
		if(stockId!=null) {
			boolQueryBuilder.must(QueryBuilders.termQuery("stockId", stockId));
		}
		boolQueryBuilder.must(QueryBuilders.rangeQuery("tradeDate").gte(startDate).lte(endDate));
		SearchSourceBuilder builder = new SearchSourceBuilder().fetchSource(dayKSimpleFields, null).query(boolQueryBuilder).size(100);
		// 构建SearchRequest
	    SearchRequest searchRequest = new SearchRequest();
	    searchRequest.indices(_IndexName_Right);
	    searchRequest.source(builder);
	    //增加Scroll
	    Scroll scroll = new Scroll(new TimeValue(600000));
	    searchRequest.scroll(scroll);
	    SearchResponse searchResponse = this.client.search(searchRequest).actionGet();
	    String scrollId = searchResponse.getScrollId();
	    SearchHit[] hits = searchResponse.getHits().getHits();
	    List<StockDayKSimple> dayKSimpleList = new ArrayList<StockDayKSimple>();
	    while (ArrayUtils.isNotEmpty(hits)) {
	    	for (SearchHit hit : hits) {
	    		String content =  hit.getSourceAsString();
	    		JSONObject json = com.alibaba.fastjson.JSONObject.parseObject(content);
	    		StockDayKSimple dayKSimple = JSON.toJavaObject(json, StockDayKSimple.class);
	    		dayKSimpleList.add(dayKSimple);
	    	}
	    	SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId);
	    	searchScrollRequest.scroll(scroll);
	    	SearchResponse searchScrollResponse = this.client.searchScroll(searchScrollRequest).actionGet();
	        scrollId = searchScrollResponse.getScrollId();
	        hits = searchScrollResponse.getHits().getHits();
	    }
	    //及时清除es快照,释放资源
	    ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
	    clearScrollRequest.addScrollId(scrollId);
	    this.client.clearScroll(clearScrollRequest);
		return dayKSimpleList;

其他

String tremsAlias = "userIdGroup";

//先分组,如果不指定size,默认10条,这里可以传个int最大值 2147483647,一次取所有数据
TermsAggregationBuilder termsAgg = AggregationBuilders.terms(tremsAlias).field("userId").size(Integer.MAX_VALUE).order(Terms.Order.term(true));
//聚合,count为自带的
termsAgg.subAggregation(AggregationBuilders.avg("avgAmount").field("amount"));
//声明BucketPath,用于后面的bucket筛选
Map<String, String> bucketsPathsMap = new HashMap<>(8);
bucketsPathsMap.put("orderCount", "_count");
bucketsPathsMap.put("avgAmount", "avgAmount");
//设置脚本
Script script = new Script("params.avgAmount >= 100 && params.orderCount >=2");

//构建bucket选择器
BucketSelectorPipelineAggregationBuilder bs =
        PipelineAggregatorBuilders.bucketSelector("having", bucketsPathsMap, script);

termsAgg.subAggregation(bs);

SearchRequestBuilder sb = client.prepareSearch("index_test").setTypes("type_order");
SearchResponse sr = sb.setSize(0).addAggregation(termsAgg).execute().actionGet();
System.out.println("查询Query:");
System.out.println(sb);

//获取聚合筛选的结果数据
LongTerms lt = sr.getAggregations().get(tremsAlias);
List<LongTerms.Bucket> buckets = lt.getBuckets();
for (int i = 0; i < buckets.size(); i++) {
    LongTerms.Bucket bucket = buckets.get(i);
    System.out.println("-------------------------");
    System.out.println(bucket.getKey());
    System.out.println("count = " + bucket.getDocCount());
    List<Aggregation> list = bucket.getAggregations().asList();
    for (Aggregation agg : list) {
        if (agg instanceof InternalAvg) {
            InternalAvg ia = bucket.getAggregations().get("avgAmount");
            System.out.println("avgAmount = " + ia.getValue());
        }
    }
    System.out.println("-------------------------");

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值