Elasticsearch: фильтрация по условиям в сгруппированных документах

Мне нужно отфильтровать результаты агрегации по условию, которое говорит, что по крайней мере один из сгруппированных документов должен иметь поле с определенным содержанием.
Мои данные-это своего рода следы событий, произошедших с различными процессами, уникальный процесс имеет много следов.

Пример моих данных:

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, только proc_id, который имеет по крайней мере одно EV_END событие.
Использование только трассировок 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 ответ

  1. Я думаю, что вы могли бы использовать агрегацию фильтра, чтобы получить proc_ids, где ev_end событие присутствует.

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