ElasticSearch 2.1.0 - Deep' children'聚合' sum'指标返回空结果

时间:2015-12-11 11:41:29

标签: elasticsearch parent-child aggregation

我有两层深度的文档类型层次结构。这些文档由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聚合只是简单地改变价格总和的水平。

我是否误解了聚合的评估方式,如果是,我怎么能修改它来显示每个子类别的总价?

1 个答案:

答案 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