elasticsearch进行parent/child类型聚合的测试:
1、查询父类型可以inner_hits得到子类型数据,反之也行
{
"query": {
"has_child": {
"query": {
"match": {
"lid": "00000"
}
},
"child_type": "article",
"inner_hits": {}
}
}
}
{
"query": {
"has_parent": {
"query": {
"match": {
"content": "公司"
}
},
"parent_type": "main",
"inner_hits": {}
}
}
}
2、has_parent、has_child查询的时候,has_parent是通过查询父类型得到子类型的列表结果,has_child反之。
3、has_parent是通过查询父类型得到子类型的列表结果,这时同时对父类型某字段进行聚合,无聚合结果返回。has_child查询的时候对子类型某字段进行聚合也没有结果。
{
"query": {
"has_child": {
"query": {
"match": {
"lid": "00000"
},
"aggs": {
"group_by_mid": {//查询结果中没有聚合数据group_by_mid
"terms": {
"field": "mid"
}
}
}
},
"child_type": "article",
"inner_hits": {}
}
}
}
4、has_parent是通过查询父类型得到子类型的列表结果,这时同时对子类型某字段进行聚合,得到聚合结果,但是返回的查询列表也为子类型,虽然inner_hits可以得到对应父类型结果,但是如果父子是一对多关系,可能得到的单分页父类型数据有重复。
{
"query": {
"has_child": {
"query": {
"match": {
"lid": "00000"
}
},
"child_type": "article",
"inner_hits": {}
}
},
"aggs": {
"group_by_years": {//有聚合数据group_by_years返回
"terms": {
"field": "years"
}
}
}
}
5、因此,如果查询父类型,并且结果分页列表要显示父类型数据,同时还要取得相关子类型数据的聚合结果的话。只有查询两次实现:
1)对父类型进行普通的查询,并取得查询分页列表结果。
2)使用has_parent,用同样的条件对父类型查询,返回子类型数据分页列表结果,同时对子类型某字段进行聚合,获取该字段的聚合数据。