• Elasticsearch学习笔记


    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> resMap = new HashMap>();
    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 params = new HashMap();
    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();

  • 相关阅读:
    JavaScript基本功之迭代器(iterator)的使用和原理
    视野修炼-技术周刊第56期
    特征值和特征向量简单入门
    全新彩虹晴天知识付费系统/多功能系统源码/虚拟商城系统
    如何把文件从本地上传云服务器
    会议OA之我的审批
    <C++入门基础>【下】
    Qt5开发从入门到精通——第三篇(窗口篇——停靠窗口)
    easyrecover15数据恢复软件官网功能介绍
    【PE】PE文件结构(一)
  • 原文地址:https://blog.csdn.net/vc33569/article/details/133958992