当前位置:   article > 正文

Elasticsearch学习笔记_scriptedmetricaggregationbuilder

scriptedmetricaggregationbuilder

1.核心概念

  • bucket: 一个数据分组(类似于sql group by以后的数据)
  • metric:对bucket执行的某种聚合分析的操作,比如说求平均值,最大值,最小值。一些系列的统计方法(类似 select count(1)  MAX  MIN  AVG)

请求参数说明:

size: 0  ,//只要聚合结果,不要原始数据,不等于0会返回原始数据

aggs: 固定语法,对数据进行分组聚合操作(类似于group by操作)

terms: 根据字段的值进行分组

field: 根据指定的字段值进行分组

返回参数说明:

hits.hits: 我们指定的size是0,所以hits.hits就是空,否则会返回聚合原始数据

aggregations:聚合结果

buckets:根据聚合条件返回的结果集

key: 每个bucket对应分组条件的值

doc_count:每个bucket分组内数据量

默认排序规则:安装doc_count 降序排列

Aggregation 的语法


例如:


2.java代码关于脚本解析(Painless 编程调试)

第一种使用自定义聚合脚本

  1. Map<String, List<TimeDuration>> resMap = new HashMap<String, List<TimeDuration>>();
  2. String index = this.getIndex();
  3. SearchRequest searchRequest = new SearchRequest(index);
  4. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().size(0);
  5. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  6. TermQueryBuilder bdsIdQueryBuilder = QueryBuilders.termQuery("bdsId", bdsId);
  7. BoolQueryBuilder lessThanStartQueryBuilder = QueryBuilders.boolQuery();
  8. RangeQueryBuilder faultStartLessThanStart = QueryBuilders.rangeQuery("faultStartTime").lte(start);
  9. RangeQueryBuilder faultEndLessThanStart = QueryBuilders.rangeQuery("faultEndTime").lte(start);
  10. lessThanStartQueryBuilder.must(faultStartLessThanStart);
  11. lessThanStartQueryBuilder.must(faultEndLessThanStart);
  12. BoolQueryBuilder greatThanStartQueryBuilder = QueryBuilders.boolQuery();
  13. RangeQueryBuilder faultStartGreatThanStart = QueryBuilders.rangeQuery("faultStartTime").gte(end);
  14. RangeQueryBuilder faultEndGreatThanStart = QueryBuilders.rangeQuery("faultEndTime").gte(end);
  15. greatThanStartQueryBuilder.must(faultStartGreatThanStart);
  16. greatThanStartQueryBuilder.must(faultEndGreatThanStart);
  17. boolQueryBuilder.must(bdsIdQueryBuilder);
  18. boolQueryBuilder.mustNot(lessThanStartQueryBuilder);
  19. boolQueryBuilder.mustNot(greatThanStartQueryBuilder);
  20. searchSourceBuilder.query(boolQueryBuilder);
  21. //这里开始是脚本聚合,自定义脚本聚合可以互相交互
  22. ScriptedMetricAggregationBuilder scriptedMetricAggregationBuilder = AggregationBuilders
  23. .scriptedMetric("fault_duration");
  24. //参数初始化
  25. Map<String, Object> params = new HashMap<String, Object>();
  26. params.put("now", now.getTime());
  27. params.put("start", start.getTime());
  28. params.put("end", end.getTime());
  29. //脚本初始化
  30. Script initScript = ScriptUtil.getScriptBy(CABLEFAULT_SCRIPT_PATH, "init_script.js");
  31. Script mapScript = ScriptUtil.getScriptBy(CABLEFAULT_SCRIPT_PATH, "map_script.js");
  32. Script combineScript = ScriptUtil.getScriptBy(CABLEFAULT_SCRIPT_PATH, "combine_script.js");
  33. Script reduceScript = ScriptUtil.getScriptBy(CABLEFAULT_SCRIPT_PATH, "reduce_script.js");
  34. scriptedMetricAggregationBuilder.params(params);
  35. scriptedMetricAggregationBuilder.initScript(initScript);
  36. scriptedMetricAggregationBuilder.mapScript(mapScript);
  37. scriptedMetricAggregationBuilder.combineScript(combineScript);
  38. scriptedMetricAggregationBuilder.reduceScript(reduceScript);
  39. TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("group_by_cableid")
  40. .field("cableId");
  41. termsAggregationBuilder.subAggregation(scriptedMetricAggregationBuilder);
  42. termsAggregationBuilder.size(ESPage.DEFAULT_ALL_PAGESIZE);
  43. termsAggregationBuilder.minDocCount(0);
  44. searchSourceBuilder.aggregation(termsAggregationBuilder);
  45. ESPage.Builder builder = new ESPage.Builder(ESPage.DEFAULT_ALL_PAGESIZE).pageNo(0);
  46. ESPage esPage = builder.build();
  47. searchSourceBuilder.from(Long.valueOf(esPage.getFrom()).intValue());
  48. searchSourceBuilder.size(0);
  49. searchRequest.source(searchSourceBuilder);
  50. //执行发送 ES调用查询
  51. SearchResponse searchResponse = this.restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
  52. Aggregations aggs = searchResponse.getAggregations();

第二种混合调用

  1. String index = this.getIndex();
  2. SearchRequest searchRequest = new SearchRequest(index);
  3. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().size(0);
  4. BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  5. TermQueryBuilder bdsIdQueryBuilder = QueryBuilders.termQuery("bdsId", bdsId);
  6. RangeQueryBuilder evaluateTimeQueryBuilder = QueryBuilders.rangeQuery("evaluateTime").gte(start).lte(end);
  7. TermQueryBuilder evaluateTypeQueryBuilder = QueryBuilders.termQuery("evaluateType",
  8. String.valueOf(evaluateType.getValue()));
  9. boolQueryBuilder.must(bdsIdQueryBuilder);
  10. boolQueryBuilder.must(evaluateTimeQueryBuilder);
  11. boolQueryBuilder.must(evaluateTypeQueryBuilder);
  12. searchSourceBuilder.query(boolQueryBuilder);
  13. TopHitsAggregationBuilder topHitsAggregationBuilder = AggregationBuilders.topHits("top_record");
  14. topHitsAggregationBuilder.sort("createDate", SortOrder.ASC);
  15. topHitsAggregationBuilder.size(CommonConstant.ES_MAX_TOP_HITS);
  16. Script filterScript=ScriptUtil.getScriptBy(HEALTH_PVLOSS_SCRIPT_PATH,"pv_filter_script.js");
  17. TermsAggregationBuilder groupByEvaluateTimeAggregationBuilder = AggregationBuilders
  18. .terms("group_by_bds_id_evaluate_time");
  19. groupByEvaluateTimeAggregationBuilder.script(filterScript);//注意一下这里,与第一种方式调用不一样
  20. groupByEvaluateTimeAggregationBuilder.subAggregation(topHitsAggregationBuilder);
  21. groupByEvaluateTimeAggregationBuilder.size(CommonConstant.ES_MAX_PAGE_SIZE);
  22. groupByEvaluateTimeAggregationBuilder.minDocCount(0);
  23. TermsAggregationBuilder groupByPvCodeAggregationBuilder = AggregationBuilders.terms("group_by_pvcode")
  24. .field("pvCode");
  25. groupByPvCodeAggregationBuilder.subAggregation(groupByEvaluateTimeAggregationBuilder);
  26. groupByPvCodeAggregationBuilder.size(CommonConstant.ES_MAX_PAGE_SIZE);
  27. groupByPvCodeAggregationBuilder.minDocCount(0);
  28. searchSourceBuilder.aggregation(groupByPvCodeAggregationBuilder);
  29. ESPage.Builder builder = new ESPage.Builder(ESPage.DEFAULT_ALL_PAGESIZE).pageNo(0);
  30. ESPage esPage = builder.build();
  31. searchSourceBuilder.size(0);
  32. searchRequest.indices(index);
  33. searchRequest.source(searchSourceBuilder);
  34. SearchResponse searchResponse = this.restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
  35. Aggregations aggs = searchResponse.getAggregations();

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/278178
推荐阅读
相关标签
  

闽ICP备14008679号