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());
经验分享 程序员 微信小程序 职场和发展