es配置
@Data
@Configuration
public class ESConfig {
@Value("${es.config.hostname}")
private String hostName;
@Bean
public RestHighLevelClient esRestHighLevelClient() {
String[] hostNameArr = hostName.split(",");
HttpHost[] httpHostArr = new HttpHost[hostNameArr.length];
for (int i = 0; i < hostNameArr.length; i++) {
String[] splitArr = hostNameArr[i].split(":");
HttpHost httpHost = new HttpHost(splitArr[0], Integer.valueOf(splitArr[1]), "http");
httpHostArr[i] = httpHost;
}
RestHighLevelClient client = new RestHighLevelClient(
// 这里可以配置多个 es服务,我当前服务不是集群,所以目前只配置一个
RestClient.builder(httpHostArr));
return client;
}
}
分组查询
public ParsedStringTerms termsAggregate(RestHighLevelClient esRestHighLevelClient, Map<String, Object> mustMap,
String rangeField, String startRange, String endRange, String key, int topN) {
SearchRequest searchRequest = new SearchRequest();
// 根据多个条件 生成 boolQueryBuilder
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 循环添加多个条件
for (Map.Entry<String, Object> entry : mustMap.entrySet()) {
boolQueryBuilder.must(QueryBuilders
.matchQuery(entry.getKey(), entry.getValue()));
}
if (StrUtil.isNotBlank(rangeField) && StrUtil.isNotBlank(startRange) && StrUtil.isNotBlank(endRange)) {
if (startRange.length() == 10) {
startRange = startRange + " 00:00:00";
}
if (endRange.length() == 10) {
endRange = endRange + " 23:59:59";
}
boolQueryBuilder.must(QueryBuilders.rangeQuery(rangeField).gte(startRange).lte(endRange));
} else if (StrUtil.isNotBlank(rangeField) && StrUtil.isNotBlank(startRange) && !StrUtil.isNotBlank(endRange)) {
if (startRange.length() == 10) {
startRange = startRange + " 00:00:00";
}
boolQueryBuilder.must(QueryBuilders.rangeQuery(rangeField).gte(startRange));
} else if (StrUtil.isNotBlank(rangeField) && !StrUtil.isNotBlank(startRange) && StrUtil.isNotBlank(endRange)) {
if (endRange.length() == 10) {
endRange = endRange + " 23:59:59";
}
boolQueryBuilder.must(QueryBuilders.rangeQuery(rangeField).lte(endRange));
}
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(boolQueryBuilder).sort("date_time", SortOrder.DESC);
searchSourceBuilder.query(boolQueryBuilder).aggregation(AggregationBuilders.terms("term").field(key).size(topN));
log.info("ES查询DSL:==> {}", searchSourceBuilder.toString());
searchRequest.source(searchSourceBuilder);
searchRequest.indices(CommonConstants.ES_NAME);
SearchResponse searchResponse = null;
try {
searchResponse = esRestHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
} catch (Exception e) {
log.error("......terms aggregate failed:{}", e);
}
return searchResponse.getAggregations().get("term");
}