背景
在elasticsearch 中可以实现通过父子关联查询(parent-child join),在新的版本中支持根据子表查询,然后根据父表聚合。
当然也有人认为可以直接转换查询条件,调整父子查询。
但现实中,为了保证查询条件的一致性,比如,查询条件主体就是子表,如果调整查询条件会导致列表与统计数据条件不一致。
代码
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
//要注意此处的parent类型应该是子表,具体原因没搞明白
ParentAggregationBuilder parentAggregationBuilder = JoinAggregationBuilders
.parent("child_type","child_type");
SumAggregationBuilder sumAgg = AggregationBuilders.sum("count").field("count");
parentAggregationBuilder.subAggregation(sumAgg);
SearchResponse searchResponse = constructorEsUtil
.getContractRestClientSearchResponse(realmId, "child_type",
boolQuery,
parentAggregationBuilder);
//解析
Parent parent = searchResponse.getAggregations().get(ContractIndexConstant.TYPE_REPAYMENT);
Map<String, Aggregation> map = parent.getAggregations().getAsMap();
总结
上面的统计可以实现,根据子表条件查询,对父表中count求和。
elasticsearch 不仅查询功能强大,统计功能也在完善,当然繁琐的统计,性能就比较差。
使用此统计需要比较新的版本,6.8中已经存在对应的API.