5

在Elasticsearch中拥有父子结构,代表orderorder_revision子女我想要生成price的柱状图,其中显示quantity的总和。Elasticsearch聚合:每个父代的最新儿童总和

{ 
    "_type": "order", 
    "_id": "1063220887", 
    "_score": 1, 
    "_source": { 
    "order_id": "1063220887", 
    "product_id": "10446350", 
    "timestamp": 1462713302000 
    } 
} 

{ 
    "_type": "order_revision", 
    "_id": "10234234", 
    "_parent": "1063220887", 
    "_source": { 
    "price": 9, 
    "quantity": 3, 
    "revision": 361, 
    "timestamp": 1462712196000 
    } 
} 

下面的聚合基本上工作,但返回所有存在的修订的总和。

{ 
    "aggs": { 
     "orders": { 
     "filter": { 
      "has_parent": { 
      "parent_type": "order" 
      } 
     }, 
     "aggs": { 
      "quantity_per_price": { 
      "histogram": { 
       "field": "price", 
       "interval": 1 
      } 
      "aggs": { 
       "sum": {"field": quantity"} 
      } 
      } 
     } 
     } 
    } 
    } 

在最终版本应该只返回quantity字段的总和为最新版本(最高/最新timestamp)每一份订单的。 我不完全确定如何拿出这样一个聚合,它由order_id分组,并只选择最新的孩子,我不知道如果这个父子结构是最好的模型这个数据。

+0

每个订单大约有多少次修订?我们正在谈论1-2或更高的数量,如10-20 +? – Val

+0

大概是10 .... –

回答

0

最简单的实施方式是在文档中标记最新版本("latest": true)。然后它成为一个简单的问题添加查询或filter聚合过滤只有最新的修订。

+0

但是请注意,当新版本进入时,还需要记住将以前的最新版本更新为'“latest”:false'。 – Val

+0

感谢您的合作......没有提到标记最新的不是真正的选择,此外我还需要扩展此功能以便能够及时退后......但是因为我不这么认为ES真的有可能,所以如果没有别的东西进来,我会接受你的回答。 –