Elasticsearch:按分组文档中的条件筛选

时间:2016-10-06 22:21:10

标签: database elasticsearch filter aggregation

我需要通过一个条件来过滤聚合结果,该条件表明至少有一个文档分组必须包含具有特定内容的字段。 我的数据是一种发生在不同进程中的事件痕迹,一个独特的进程有很多痕迹。

我的数据示例:

proc_id event   timestamp
1       ON      1000
1       EV1     1001
2       ON      1002
1       OFF     1003
3       ON      1004
2       EV2     1005
3       EV1     1006
3       EV_END  1007
2       EV_END  1008

例如,我需要按proc_id分组,只需要至少包含一个EV_END事件的proc_id。 仅使用EV_END跟踪不是解决方案,因为我需要处理事物(如事件的次数和次数),以及之后的proc_id的所有痕迹。

我在版本2.x中看到有bucket_selectors和脚本,但我没有得到这个想法。

我想做的伪查询:

curl -XPOST 'localhost:9200/proc/_search?pretty' -d '
{
    "query": { "match_all": {} },
    "aggs": {
        "group_by_proc_id": {
            "terms": {
             "field": "proc_id",
             **ONLY if proc has at least one trace with event == 'EV_END'**
            }
        }
    }
}'

1 个答案:

答案 0 :(得分:0)

我认为您可以使用filter aggregation来获取存在EV_END事件的 proc_ids

{
  "query": {
    "match_all": {}
  },
  "size": 0,
  "aggs": {
    "EV_END": {
      "filter": {
        "term": {
          "event": "EV_END"
        }
      },
      "aggs": {
        "proc_group": {
          "terms": {
            "field": "proc_id",
            "size": 10
          }
        }
      }
    }
  }
}