如何使用脚本执行MultiTerms聚合?

时间:2014-12-08 01:29:50

标签: elasticsearch

在弹性文档中,它表示如果我使用scriptreference),我可以执行多项聚合。我不清楚这是如何完成的。基本上我所追求的是count(*) ... group by logsource,pid。如果没有脚本,我似乎只能通过一组来完成。

有人能告诉我一个例子吗?

2 个答案:

答案 0 :(得分:1)

使用脚本可能代价高昂,但要回答您的问题,

POST /_search
{
    "size": 0,
    "aggs": {
       "test": {
          "terms": {
             "script": "doc['logsource'].value+\":\"+doc['pid'].value",
             "size": 0
          }
       }
    }
}

会的!

答案 1 :(得分:0)

我认为通过使用子聚合,我可以得到预期的结果,例如:

{
"query" : {
            "match": {
                "message": "error"
            }
},

"aggs": {
    "g_logsource": {
        "terms": {
            "field": "logsource"
        },
        "aggs": {
            "g_pid": {
                "terms": {
                    "field": "pid"
                },
                "aggs" : {
                    "ts" : {
                        "date_histogram" : {
                            "field" : "@timestamp",
                            "interval" : "1h"
                        }
                    }
                }   
            }                           
        }            
    }
}

}

返回:

 "aggregations": {
  "g_logsource": {
     "doc_count_error_upper_bound": 0,
     "buckets": [
        {
           "key": "nyhq",
           "doc_count": 2129,
           "g_pid": {
              "doc_count_error_upper_bound": 5,
              "buckets": [
                 {
                    "key": "5641",
                    "doc_count": 9,
                    "ts": {
                       "buckets": [
                          {
                             "key_as_string": "2014-12-07T04:00:00.000Z",
                             "key": 1417924800000,
                             "doc_count": 2
                          },
                          {
                             "key_as_string": "2014-12-07T08:00:00.000Z",
                             "key": 1417939200000,
                             "doc_count": 4
                          },
                          {
                             "key_as_string": "2014-12-07T18:00:00.000Z",
                             "key": 1417975200000,
                             "doc_count": 1
                          },
                          {
                             "key_as_string": "2014-12-07T20:00:00.000Z",
                             "key": 1417982400000,
                             "doc_count": 2
                          }
                       ]
                    }
                 },
                 {
                    "key": "14839",
                    "doc_count": 3,
                    "ts": {
                       "buckets": [
                          {
                             "key_as_string": "2014-12-07T09:00:00.000Z",
                             "key": 1417942800000,
                             "doc_count": 1
                          },
                          {
                             "key_as_string": "2014-12-07T20:00:00.000Z",
                             "key": 1417982400000,
                             "doc_count": 2
                          }
                       ]
                    }
                 }

在我的代码中,我可以将组合{logsource: nyhq, pid: 5641}组合为每个时间序列的标识符。我认为这与SQL中的GROUP BY相同。非常感谢任何确认这一点的评论。