2016-12-02 82 views
0

我必須運行復雜聚合,其中一個步驟是計算sold_qty字段的總和,然後我需要將此總和與非聚合字段all_qty相減。我的數據如下:計算字段和聚合字段之間的差異

{item_id: XXX, sold_qty: 1, all_qty: 20, price: 100 } 
{item_id: XXX, sold_qty: 3, all_qty: 20, price: 100 } 
{item_id: YYY, sold_qty: 1, all_qty: 20, price: 80 } 

這些是來自要約的交易。 all_qty和price字段是多餘的 - 表示來自其他結構的單個值 - 報價並且僅在單個報價(由item_id標識)的所有交易中重複。

在SQL中的條款我需要的是:

SELECT (all_qty - sum(sold_qty)) * price GROUP BY item_id 

我所做的是聚集

'{ 
"query": {"term": {"seller": 9059247}}, 
"size": 0, 
"aggs": { 
    "group_by_offer": { 
    "terms": { "field": "item_id", size: 0}, 
    "aggs": { "sold_sum": {"sum": {"field": "sold_qty"}}} 
} 
} 
}' 

但我不知道下一步該怎麼做,以實現我的目標。

+0

你有哪個版本的ES的? – Val

回答

0

由於您已經存儲了冗餘字段,如果我是您,我還會存儲all_price = all_qty * pricesold_price = sold_qty * price的結果。這不是強制性的,但是在執行時會比執行腳本來執行相同的計算更快。

{item_id: XXX, sold_qty: 1, sold_price: 20, all_qty: 20, price: 100, all_price: 2000 } 
{item_id: XXX, sold_qty: 3, sold_price: 300, all_qty: 20, price: 100, all_price: 2000 } 
{item_id: YYY, sold_qty: 1, sold_price: 80, all_qty: 20, price: 80, all_price: 1600 } 

所有你必須接下來要做的就是總結sold_price平均all_price,只需使用bucket_script管道聚合得到兩者的區別:

{ 
    "query": { 
    "term": { 
     "seller": 9059247 
    } 
    }, 
    "size": 0, 
    "aggs": { 
    "group_by_offer": { 
     "terms": { 
     "field": "item_id", 
     "size": 0 
     }, 
     "aggs": { 
     "sold_sum": { 
      "sum": { 
      "field": "sold_price" 
      } 
     }, 
     "all_sum": { 
      "avg": { 
      "field": "all_price" 
      } 
     }, 
     "diff": { 
      "bucket_script": { 
      "buckets_path": { 
       "sold": "sold_sum", 
       "all": "all_sum" 
      }, 
      "script": "params.all - params.sold" 
      } 
     } 
     } 
    } 
    } 
} 
+0

這有什麼好運? – Val