2016-10-06 11 views
0

グループ化された文書の少なくとも1つに特定の内容のフィールドが必要であるという条件で集計結果をフィルタリングする必要があります。 私のデータは、異なるプロセスに発生したイベントの痕跡の一種であり、独自のプロセスには多くのトレースがあります。私のデータの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、少なくとも一つのEV_ENDイベントを持っているだけでPROC_IDによってグループにする必要があります。 proc_idのすべての痕跡で、後で(時間やイベントの数など)処理する必要があるため、EV_ENDトレースを取得するだけの解決策ではありません。

バージョン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

投稿したサンプルデータに必要な出力を提供できますか? – ChintanShah25

+0

これは正確な出力ではありませんが、 "疑似クエリ"はアイデアを示しています – Hamlett

+0

解決策は役に立ちましたか? – ChintanShah25

答えて

0

は、私はあなたがEV_ENDイベントが存在する場合proc_idsを取得するためにfilter aggregationを使用できると思います。

{ 
    "query": { 
    "match_all": {} 
    }, 
    "size": 0, 
    "aggs": { 
    "EV_END": { 
     "filter": { 
     "term": { 
      "event": "EV_END" 
     } 
     }, 
     "aggs": { 
     "proc_group": { 
      "terms": { 
      "field": "proc_id", 
      "size": 10 
      } 
     } 
     } 
    } 
    } 
} 
関連する問題