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中的查询结构:
![在这里插入图片描述](https://img-blog.csdnimg.cn/fe6700fd0b064cac9913c9cabbec27ad.png)
现在希望对字段 productTags 进行聚合,想要聚合后结构如下:
[
{key:'化肥',value:2},
{key:'农药',value:1},
{key:'尿素',value:2},
]
请教如何操作呢? 我用easy-es的api进行聚合一直报错。
![在这里插入图片描述](https://img-blog.csdnimg.cn/8d69ce8a3d20425b8dafe9650f2c48c1.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/f937379a47fe4b13b0a317e271b6db1f.png)
解决方案:
因为这种方式叫做嵌套聚合,所以无法使用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;
}
返回的结果如图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/b78380a4259e4c14bcacf1bd26f23d52.png)