2015-08-13 44 views
0

我有一些數據在elasticsearch,我發現很難創建我需要獲取一些數據的查詢。elasticsearch Query:Sum + Case Equivalent?

的數據我的組織,像這樣(如果我是在csv格式來顯示它):

campaignid, sellerid, action 
A, mike, sell 
A, mike, buy 
A, mike, buy 
A, joe, sell 
A, joe, sell 
A, joe, sell 
B, mike, sell 
B, mike, sell 
B, mike, sell 
B, alice, buy 
B, alice, buy 

我想要得到這樣的結果集:

campaignid, sellerid, sales, buys 
A, mike, 1, 2 
A, joe, 3, 0 
B, mike, 3, 0 
B, alice, 0, 2 

SQL,我我很熟悉,我會這樣寫:

SELECT campaignid, sellerid, SUM(CASE WHEN action='sell' THEN 1 ELSE 0 END) as sales, SUM(CASE WHEN action='buy' THEN 1 ELSE 0 END) as buys 
GROUP BY campaignid, sellerid 

我正在努力工作在彈性搜索中是等價的。我已設法使用this page的幫助來按組進行數據計數。

但是我失去了如何獲得我想要的數據(總結案例時)。這是我想出了:

GET _search 
{ 
    "size": 0, 
    "aggs": { 
    "group_by_campaignid": { 
     "terms": { 
     "field": "campaignid" 
     }, 
     "aggs": { 
     "group_by_sellerid": { 
      "terms": { 
      "field": "sellerid" 
      } 
     } 
     } 
    } 
    } 
} 

任何人都可以幫忙寫我想查詢?謝謝。

回答

0

所以,解決方案是使用腳本。首先,在你elasticsearch.yaml文件中啓用腳本:

script.engine.groovy.inline.aggs: on 

然後,可以使用sum運營商在腳本值。因此,舉例來說,這將是相當於case/when結果聲明中sqlsum(僅綜上所述,如果字段值等於什麼東西,在這個例子中,我要總結Chrome瀏覽器的唯一實例):

GET _search 
{ 
    "size": 0, 
    "aggs": { 
    "group_by_browser": { 
     "terms": { 
     "field": "browser" 
     },"aggs" : { 
     "intraday_return" : { "sum" : { "script" : "doc['browser'].value == 'chrome' ? 1 : 0" } } 
    } 
    } 
    } 
}