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");
```