1.等价的sql
Sql代码 :
SELECT DISTINCT field1,field2 FROM test_index.test_type
等价于
Sql代码:
SELECT field1,field2 FROM test_index.test_type GROUP BY field1,field2
Controller:
这是根据类型和传过来的可变字段key来查询
/**
* 布局管理-聚合查询
* @param logType
* @return
*/
@Override
@GetMapping("/logs/layout/manager")
public Map queryLayout(@RequestParam(required = false) String logType, @RequestParam(required = false) String modifiableKey){
Map map = new HashMap<>();
if (modifiableKey != null) {
// List modifiableKeyList = Arrays.asList(modifiableKeys.split(","));//用逗号隔开
// for (String modifiableKey : modifiableKeyList) {
// }
List operationRecords = appleAppOperationLogService.queryLayout(logType, modifiableKey);
map.put(modifiableKey, operationRecords);
}
return map;
}
Service:
/**
* 根据logType查询modifiableKey 不重复
* @param logType
* @return
*/
@Override
public List queryLayout(String logType, String modifiableKey) {
List list = new ArrayList();
//聚合
TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("modifiableKey").field(modifiableKey+".keyword");
SearchRequest searchRequest = new SearchRequest(INDEX);
searchRequest.types(TYPE);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.matchAllQuery());//查询所有 此处为匹配所有文档
//elasticsearch 里默认的IK分词器是会将每一个中文都进行了分词的切割,所以你直接想查一整个词 加上.keyword
boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("logType.keyword", logType));
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();// 1.创建并设置SearchSourceBuilder对象
sourceBuilder.query(boolQueryBuilder);
sourceBuilder.aggregation(aggregationBuilder);//聚合查询
searchRequest.source(sourceBuilder);
try {
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
Aggregations aggregations = searchResponse.getAggregations();
Aggregation tags = aggregations.asMap().get("modifiableKey");
Terms teamSum= (Terms)tags;
List extends Terms.Bucket> buckets = teamSum.getBuckets();
for (Terms.Bucket bucket : buckets) {
list.add(bucket.getKeyAsString());
}
} catch (IOException e) {
log.error(e.getMessage(), e);
}
return list;
}