es实体类:
public class ChemicalES {
@IndexId ( type = IdType . CUSTOMIZE )
private Long id;
@HighLight
@IndexField ( fieldType = FieldType . TEXT , analyzer = "ik_max_word" )
private String name;
@IndexField ( fieldType = FieldType . KEYWORD )
private List < String > productTags;
}
存入es中的查询结构:
现在希望对字段 productTags 进行聚合,想要聚合后结构如下:
[
{ key:'化肥' ,value:2} ,
{ key:'农药' ,value:1} ,
{ key:'尿素' ,value:2} ,
]
请教如何操作呢? 我用easy-es的api进行聚合一直报错。
解决方案:
因为这种方式叫做嵌套聚合,所以无法使用easy-es相关api,easy-es的groupBy只适合 key_word类型的 非数组属性的字段,而数组属性的字段 需要利用restHighLevelClient。
以下是通用代码示例:
@Autowired
public RestHighLevelClient restHighLevelClient;
private List < Map < Object , Object > > commonGroup ( String indexName, MultiMatchQueryBuilder multiMatchQuery,
String fieldName, String fieldNameAs
) throws IOException {
SearchRequest request = new SearchRequest ( ) ;
request. indices ( indexName) ;
SearchSourceBuilder builder = new SearchSourceBuilder ( ) ;
builder. size ( 0 ) ;
AggregationBuilder aggregationBuilder = AggregationBuilders . terms ( fieldNameAs)
. field ( fieldName) . order ( BucketOrder . count ( false ) ) ;
builder. aggregation ( aggregationBuilder) ;
if ( multiMatchQuery != null ) {
builder. query ( multiMatchQuery) ;
}
request. source ( builder) ;
SearchResponse response = restHighLevelClient. search ( request, RequestOptions . DEFAULT ) ;
Aggregations aggregations = response. getAggregations ( ) ;
ParsedStringTerms colorGroup = aggregations. get ( fieldNameAs) ;
List < ? extends Terms. Bucket > buckets = colorGroup. getBuckets ( ) ;
List < Map < Object , Object > > result = new ArrayList < > ( ) ;
for ( Terms. Bucket bucket : buckets) {
Map < Object , Object > map = new HashMap < > ( 2 ) ;
System . out. println ( "name:" + bucket. getKey ( ) + "," + "count:" + bucket. getDocCount ( ) ) ;
map. put ( "name" , bucket. getKey ( ) ) ;
map. put ( "count" , bucket. getDocCount ( ) ) ;
result. add ( map) ;
}
return result;
}
返回的结果如图: