我有两层深度的文档类型层次结构。这些文档由parent-child relationships关联,如下所示: category > sub_category > item 即每个 sub_category 都有_parent
字段引用类别 ID,每个项都有_parent
字段,指的是 sub_category id。
每个项都有一个price
字段。给定一个类别查询,其中包括子类别和项目的条件,我想计算每个 sub_category 的总价格。
我的查询看起来像这样:
{
"query": {
"has_child": {
"child_type": "sub_category",
"query": {
"has_child": {
"child_type": "item",
"query": {
"range": {
"price": {
"gte": 100,
"lte": 150
}
}
}
}
}
}
}
}
我计算每个子类别价格的汇总如下:
{
"aggs": {
"categories": {
"terms": {
"field": "id"
},
"aggs": {
"sub_categories": {
"children": {
"type": "sub_category"
},
"aggs": {
"sub_category_ids": {
"terms": {
"field": "id"
},
"aggs": {
"items": {
"children": {
"type": "item"
},
"aggs": {
"price": {
"sum": {
"field": "price"
}
}
}
}
}
}
}
}
}
}
}
}
尽管查询响应列出了匹配结果,但聚合响应并不匹配任何项目:
{
"aggregations": {
"categories": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "category1",
"doc_count": 1,
"sub_categories": {
"doc_count": 3,
"sub_category_ids": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "subcat1",
"doc_count": 1,
"items": {
"doc_count": 0,
"price": {
"value": 0
}
}
},
{
"key": "subcat2",
"doc_count": 1,
"items": {
"doc_count": 0,
"price": {
"value": 0
}
}
},
{
"key": "subcat3",
"doc_count": 1,
"items": {
"doc_count": 0,
"price": {
"value": 0
}
}
}
]
}
}
}]
}
}
}
但是,省略sub_category_ids
聚合确实会导致项目出现,并且价格会在categories
聚合级别汇总。我希望包括sub_category_ids
聚合只是简单地改变价格总和的水平。
我是否误解了聚合的评估方式,如果是,我怎么能修改它来显示每个子类别的总价?
答案 0 :(得分:1)
关于children aggregation
我打开了一个问题#15413,因为我和其他人在ES 2.0
显然,根据ES开发人员@martijnvg的问题是
孩子们会做出一个假设(所有片段都被儿童聚集在一起),这在1.x中是正确的但在2.x中是不正确的
PR #15457再次从@martijnvg
解决了这个问题在我们仅评估在父aggs中产生匹配的细分之前,这导致我们错过评估细分中的子文档,我们没有父匹配。
对此的修复是停止记住我们匹配的段 并简单地评估所有细分。这使代码更简单,我们 仍然可以快速查看某个细分受众群是否像我们一样持有子文档 前
此拉取请求已合并,并且已移植至2.x, 2.1 and 2.0 branches
。