// 过滤字段
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("-------------------------");
}