1、设置Query(过滤条件)
// 方法中前者表示es索引中的字段名,后者表示过滤条件的值
BoolQueryBuilder query = QueryBuilders.boolQuery()
.filter(QueryBuilders.termQuery("serviceIp", serviceIp)) // 精确查询
.filter(QueryBuilders.wildcardQuery("location", "*" + host + "*")) // 模糊查询
.filter(QueryBuilders.rangeQuery("errorCode").lt(0).gte(400)) // 范围查询
.filter(QueryBuilders.rangeQuery("timestamp").from("2019-01-19").to("2019-02-19")); // 范围查询
// 判断不为空,再设置
if (StringUtils.isNotBlank(country)) {
query.filter(QueryBuilders.termQuery("country", country));
}
// should的用法
query.should(QueryBuilders.termQuery("device", device));
// must的用法
query.must(QueryBuilders.termQuery("device", device));
2、设置Aggregation(ES分桶)
3、分位值
// 按时间分桶(时间间隔为一天"day")
DateHistogramAggregationBuilder histogramAgg = AggregationBuilders.dateHistogram("dateHistogram").field("timestamp")
.extendedBounds(new ExtendedBounds(from, to)).minDocCount(0)
.dateHistogramInterval(new DateHistogramInterval("day"));
// 定义不同的分位值
double[] percents = new double[]{50, 75, 90, 99.9};
histogramAgg.subAggregation(AggregationBuilders.percentiles("percentiles").field("duration").percentiles(percents));
SearchResponse searchResponse = CLIENT.prepareSearch(indexName)
.setQuery(query).addAggregation(histogramAgg)
.setSize(0).execute().actionGet();
if (searchResponse.getHits().getTotalHits() > 0) {
Histogram histogram = searchResponse.getAggregations().get("dateHistogram");
for (Histogram.Bucket histogramBucket : histogram.getBuckets()) {
// 分位值取值方法
Percentiles percentiles = histogramBucket.getAggregations().get("percentiles");
JSONObject jsonObject = new JSONObject();
for (Percentile percentile : percentiles) {
jsonObject.put(String.valueOf(percentile.getPercent()), percentile.getValue());
}
System.out.println(jsonObject.toString());
}
}
4、排序