elasticsearch对搜索结果进行聚合
elasticsearch对搜索结果进行聚合
最近项目需要在es返回结果的基础上,做筛选,筛选条件需要基于es的搜索结果动态变化,这里使用es的聚合函数解决了这个问题,以下是使用的简单说明,在此做个记录
elasticsearch需要依赖的jar包:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.0</version>
<exclusions>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
<exclusion>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.4.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.4.0</version>
</dependency>
查询时候指定需要分组的字段,可以是一个也可以是多个
SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//拼接查询条件
.
.
.
//设置需要聚合的字段,类似mysql的group by
sourceBuilder.aggregation(AggregationBuilders.terms("retailPrice_count").field("字段1"));
sourceBuilder.aggregation(AggregationBuilders.terms("shelfDayLevel_count").field("字段2"));
searchRequest.source(sourceBuilder);
获取分组结果的时候用下面代码方式获取,objects就表示字段1有哪些值
SearchResponse searchResponse = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);
Map<String, Aggregation> aggrMap = searchResponse.getAggregations().asMap();
Terms terms = (Terms) aggrMap.get("字段1");
List<Object> objects = terms.getBuckets().stream().map(it->((Terms.Bucket) it).getKey()).collect(Collectors.toList());
