简单查询— be like select * from where
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
//精准查询,注意这个keyword 如果不加会分词
queryBuilder.must(QueryBuilders.matchQuery("字段名.keyword", 入参));
//时间范围查询
queryBuilder.must(QueryBuilders.rangeQuery("存时间的字段").gte(开始时间).lte(结束时间));
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withQuery(queryBuilder);
//排序
FieldSortBuilder order = SortBuilders.fieldSort("要排序的字段.keyword").order(SortOrder.DESC);
nativeSearchQueryBuilder.withSort(order);
//PageRequest number 从0开始 (巨坑点)
nativeSearchQueryBuilder.withPageable(PageRequest.of(vo.getPageNum() - 1, vo.getPageSize()));
// Page<接收对象> entity= elasticsearchTemplate.queryForPage(nativeSearchQueryBuilder.build(), 接收对象.class);
//两种分页查询
Page<接收对象> entity= repository.search(nativeSearchQueryBuilder.build());
聚合查询使用,分桶什么的
简单聚合 avg count max min
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
//size(设置桶的数量大小) 如果自己不设置 会有一个默认桶大小10
//这个group是自定义名字
TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("group").field(param).size(size);
//过滤
queryBuilder.must(QueryBuilders.termsQuery(过滤入参, values));
queryBuilder.must(QueryBuilders.rangeQuery("request_timeymdhms").gte(startTime).lte(endTime));
//聚合查询
AvgAggregationBuilder avg = AggregationBuilders.avg("avg_cost").field("需要聚合的字段");
MinAggregationBuilder min = AggregationBuilders.min("min_cost").field("需要聚合的字段");
MaxAggregationBuilder max = AggregationBuilders.max("max_cost").field("需要聚合的字段");
//多个聚合查询
aggregationBuilder.subAggregation(avg).subAggregation(min).subAggregation(max);
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withQuery(queryBuilder);
nativeSearchQueryBuilder.withSearchType(SearchType.DEFAULT);
nativeSearchQueryBuilder.addAggregation(aggregationBuilder);
Aggregations aggregations = elasticsearchTemplate.query(nativeSearchQueryBuilder.build(), new ResultsExtractor<Aggregations>() {
@Override
public Aggregations extract(SearchResponse response) {
return response.getAggregations();
}
});
//处理获取的数据
Map<String, Aggregation> map = aggregations.asMap();
List<StringTerms.Bucket> buckets = ((StringTerms) map.get("group")).getBuckets();
buckets.forEach(e -> {
// 过滤入参--e.getKeyAsString();
//文档总数 e.getDocCount();
System.out.println(e.getKeyAsString() + ":-----" + e.getDocCount());
//平均数 最大值那些
List<Aggregation> list = e.getAggregations().asList();
for (Aggregation aggregation : list) {
System.out.println(aggregation.getName() + "------" + aggregation.getType());
if ("max".equals(aggregation.getType())) {
//最大值,用double装的
((InternalMax) aggregation).getValue();
} else if ("min".equals(aggregation.getType())) {
((InternalMin) aggregation).getValue();
} else if ("avg".equals(aggregation.getType())) {
//处理平均值
double avg = ((InternalAvg) aggregation).getValue();
}
}
});
过滤分桶再排序
例如 统计某个接口的平均用时最长的前十名
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
//聚合查询
AvgAggregationBuilder avg = AggregationBuilders.avg("avg_cost").field("ES时间字段");
TermsAggregationBuilder aggregationBuilder = AggregationBuilders
.terms("group")
.field("要统计的字段.keyword")
.size(10)
.subAggregation(avg)
//每个桶按照avg的值来排序
.order(Terms.Order.aggregation(avg.getName(), "value", false)); //排序 "这个value是报错让我这么写的"
// String endDate "时间过滤 自己决定要不要";
// String startDate = "";
queryBuilder.must(QueryBuilders.rangeQuery("ES的时间字段").gte(startDate).lte(endDate));
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withQuery(queryBuilder);
nativeSearchQueryBuilder.addAggregation(aggregationBuilder);
Aggregations aggregations = elasticsearchTemplate.query(nativeSearchQueryBuilder.build(), new ResultsExtractor<Aggregations>() {
@Override
public Aggregations extract(SearchResponse response) {
return response.getAggregations();
}
});
Map<String, Aggregation> map = aggregations.asMap();
List<StringTerms.Bucket> buckets = ((StringTerms) map.get("group")).getBuckets();
//组装
这里和上面聚合拿数据一样的
}
```