JAVA操作ES

### 固定格式 ``` public SearchResponse methodName (Params params){ RestHighLevelClient client = null; try { client = ElasticSearchPoolUtil.getClient(); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("indexName"); // 设置查哪个索引(表)。 // 具体操作代码 // ... return client.search(searchRequest, RequestOptions.DEFAULT); // 查询通用,增、删、改跟换对应的即可 client可以点出来,选择自己需要的就行 } catch (Exception e) { e.printStackTrace(); } finally () { ElasticSearchPoolUtil.returnClient(client); // 切记不要忘记这一步。 } } ``` ### 基本查询 ``` // 查询某机构下的所有设备。 // ... // 省略头部代码 searchRequest.indices("b_equipment_entity"); // 设置查哪个索引(表)。 BoolQueryBuilder bool = new BoolQueryBuilder(); TermsQueryBuilder terms = new TermsQueryBuilder("memberId",333); bool.must(terms); sourceBuilder.query(bool); searchRequest.source(sourceBuilder); return client.search(searchRequest, RequestOptions.DEFAULT); //... //省略尾部代码 ``` 接收:从返回结果中获取hist中的值,用对应的List接收即可。 ### 添加范围检索 ``` RangeQueryBuilder dateRange = new RangeQueryBuilder("startTime") .gte(beginData) .lte(endDate) .format(Constant.UTC_DATE_FORMAT); // 设置时间格式,否则会报错,格式不匹配。 bool.filter(dateRange); ``` ### 聚合 完整演示代码,请查看report项目。 ``` 目前使用到的聚合管道。 1.TermsAggregationBuilder 普通聚合 2.SumAggregationBuilder 求和 2.AvgAggregationBuilder 平均值 3.DateHistogramAggregationBuilder 日期 4.PipelineAggregatorBuilders bucket script,用于计算 TermsAggregationBuilder group_by_*** = AggregationBuilders.terms("group_by_***").field("***"); SumAggregationBuilder sumName = AggregationBuilders.sum("别名").field("求和字段"); AvgAggregationBuilder avgName = AggregationBuilders.avg("别名").field("平均值字段"); DateHistogramAggregationBuilder group_by_date = AggregationBuilders.dateHistogram("别名").field("字段名"); group_by_date.dateHistogramInterval(DateHistogramInterval.DAY); // 根据天分组 //所有时间跨度 SECOND 1s 1秒 MINUTE 1m 1分钟 HOUR 1h 1小时 DAY 1d 1天 WEEK 1w 1周 MONTH 1M 1月 QUARTER 1q 1季 YEAR 1y 1年 // 接收TermsAgg 的值 ParsedSimpleValue 类 // 接收SumAgg 的值 ParsedSum 类 // 接收AvgAgg 的值 ParsedAvg 类 // response.getInternalResponse().aggregations() 首先获取InternalResponse,然后再获取管道。 // TermsAggregationBuilder 的bucket 使用 List<? extends Terms.Bucket> 接收,如 List<? extends Terms.Bucket> iotCodes = getBuckets(member.getAggregations(), "group_by_iotCode"); // DateHistogramAggregationBuilder 使用 List<? extends ParsedDateHistogram.ParsedBucket> 接收,如 List<? extends ParsedDateHistogram.ParsedBucket> dateOfDay = getDateBuckets(iotCode.getAggregations(),"group_by_date"); // 获取计算的到的结果,需要从Map中获取。 // 以run表为例,如若要获取总运行毫秒数,则可以使用如下代码段。 Aggregations agg = date.getAggregations(); Map<String, Aggregation> valueMap = agg.getAsMap(); ParsedSum runTime = (ParsedSum) valueMap.get("runTime"); ``` ES的聚合是一层嵌一层,而不是一个结果集。 在使用往sourceBuild中构建聚合时,要按照顺序,使用subAggregation()构建。 同层多个subAggregation并列。如下代码段所示,具体实现请参照report项目。 ``` sourceBuilder.aggregation( group_by_region.subAggregation( group_by_iotCode .subAggregation(unit) .subAggregation(project) .subAggregation(category) .subAggregation(city) .subAggregation(memberTypeName) .subAggregation(equipmentNo) .subAggregation( group_by_date .subAggregation(runTime) .subAggregation(workAmount) .subAggregation(PipelineAggregatorBuilders.bucketScript("hours", hoursMap, hoursScript)) .subAggregation(PipelineAggregatorBuilders.bucketScript("totalCleanArea", totalCleanAreaMap, totalCleanAreaScript)) ) ) ); ``` >wdateHistogramInterval 此方法已过时,但,目前尚未找到代替的方法,所以先暂时使用此方法。 >w 注:在使用script聚合时,可能会有空值,导致整个计算结果不存在的情况,所有要注意判断一下计算字段是否为空,或值是否为0.请参考以下代码片段,若workAmount,或runTime为空或0.则会导致hours和totalCleanArea两字段不存在,导致空指针。其中runTime字段,也是计算出来的。累加的intervals字段。若设备在指定时段内,无运行数据,则此值会为0.因为此处我用的是BigDecimal类型,所以判断条件使用0.0 ``` Aggregations agg = date.getAggregations(); Map<String, Aggregation> valueMap = agg.getAsMap(); ParsedAvg workAmount = (ParsedAvg) valueMap.get("workAmount"); ParsedSum runTime = (ParsedSum) valueMap.get("runTime"); if (workAmount == null || Double.parseDouble(String.valueOf(runTime.value())) == 0.0) { continue; } ParsedSimpleValue hours = (ParsedSimpleValue) valueMap.get("hours"); ParsedSimpleValue totalCleanArea = (ParsedSimpleValue) valueMap.get("totalCleanArea"); ```