2017-02-02 1 views
0

AGGS 플러스 및/또는 필터링 로그를 중첩 나는 ElasticSearch 내가 ElasticSearch에 일부 로그를 인덱싱하고있어

나는이 매핑 인덱스를했습니다 ... 몇 가지 정보를 얻을하기 위해 ES API를 요청하는 몇 가지 의심을했습니다 :

"appName" : { 
"type" : "string", 
    "index" : "not_analyzed" 
}, 
"log" : { 
    "type" : "string" 
}, 
"projectName" : { 
    "type" : "string", 
    "index" : "not_analyzed" 
} 

나는 일부 응용 프로그램 ("프로그램 응용") '내부'와 일부 프로젝트 ("프로젝트 이름")을했습니다. 예 : App1과 App2는 Project1에 속합니다. "log"는 응용 프로그램 stdout/stderror에서 나온 '로그 라인'에 대한 것입니다.

예를 들어 로그 라인에 'debug'가 포함 된 최신 시간 로그 라인을 가져올 수 있습니다. aggs를 사용하고 버킷에 정보를 가져 오는 중입니다. I합니다 (ES API에 컬 쿼리) 이런 식으로 일을 해요 :

{ 
"size" : 0, 
"query" : 
{ "range" : { "time" : { "from" : "now-1h", "to" : "now" } } }, 
"aggs": 
{ 
    "matcheo" : 
    { 
    "filter": 
    { 
    "match": { "log" : "debug" } 
    }, 
    "aggs": 
    { 
    "projectName": 
    {  
    "terms": { "field": "projectName", "size":0 }, 
    "aggs": 
    { 
     "appName": 
     { 
     "terms": { "field": "appName", "size":0 } 
     } 
    } 
    } 
    } 
    } 
} 
} 

결과 : 등등 각각의 프로젝트 이름에서 각 프로그램 응용과 ... 내가 Project1의 두 가지를 가지고있어

... 
    "matcheo" : { 
     "doc_count" : 25, 
     "projectName" : { 
     "doc_count_error_upper_bound" : 0, 
     "sum_other_doc_count" : 0, 
     "buckets" : [ { 
      "key" : "Project1", 
      "doc_count" : 12, 
      "appName" : { 
      "doc_count_error_upper_bound" : 0, 
      "sum_other_doc_count" : 0, 
      "buckets" : [ { 
       "key" : "App1", 
       "doc_count" : 12 
      }, { 
       "key" : "App2", 
       "doc_count" : 48 
      },    
      } ] 
... 

애플 리케이션 : "디버그"가 포함 된 12 개의 문서가있는 App1과 "디버그"가 포함 된 48 개의 문서가있는 App2 ...

지금 당장하고 싶은 것은 최신의 로그 라인을 얻는 것입니다. '디버그'또는 '오류'또는 '경고'를 포함하지만이 용어로 '병합'합니다. 예를 들어 각 appName (각 projectName에서)에 대해 "log :"에 "debug"가 포함 된 수, "log :"에는 "error"가 포함되어 있고 "log"에는 "warning"이 포함되어 있습니다 ...

나는 '필터'를 시도했습니다 : "match": { "log" : "debug warning error" } 그리고 나는 각 용어에 대해 얼마나 많은 것을 얻지 못합니다.

나를 도와 줄 수있는 사람이 있습니까? 미리 감사드립니다! 건배!

답변

0

알 수 있습니다. 필터 집계 사용!

{ 
"size" : 0, 
"query" : 
{ "range" : { "time" : { "from" : "now-1h", "to" : "now" } } }, 
"aggs": 
{  
    "projectName": 
    {  
    "terms": { "field": "projectName", "size": 0}, 
    "aggs": 
    { 
    "appName": 
    { 
    "terms": { "field": "appName", "size": 0}, 
    "aggs": 
    { 
     "typology" : 
     { 
     "filters" : 
     { 
     "other_bucket_key": "other", 
     "filters" : 
     { 
     "errors" : { "match" : { "log" : "error" }}, 
     "warnings" : { "match" : { "log" : "warning" }}, 
     "debug" : { "match" : { "log" : "debug" }} 
     } 
     } 
     } 
    } 
    } 
    } 
    } 
} 
} 

그래서 그것은 작동 지금은 이런 걸 얻을 수 있어요 : 나는이 ... 내가 생각 얻기 위해 최선의 방법을 사용하고 생각

"aggregations" : { 
    "projectName" : { 
     "doc_count_error_upper_bound" : 0, 
     "sum_other_doc_count" : 0, 
     "buckets" : [ { 
     "key" : "Project1", 
     "doc_count" : 5, 
     "appName" : { 
      "doc_count_error_upper_bound" : 0, 
      "sum_other_doc_count" : 0, 
      "buckets" : [ { 
      "key" : "App1", 
      "doc_count" : 5, 
      "tipologia" : { 
       "buckets" : { 
       "errors" : { 
        "doc_count" : 0 
       }, 
       "warnings" : { 
        "doc_count" : 0 
       }, 
       "debug" : { 
        "doc_count" : 5 
       }, 
       "other" : { 
        "doc_count" : 0 
       } 
       } 
      } 
      }, { 
      "key" : "App2", 
      "doc_count" : 4, 
      "tipologia" : { 
       "buckets" : { 
       "errors" : { 
        "doc_count" : 2 
       }, 
       "warnings" : { 
        "doc_count" : 0 
       }, 
       "debug" : { 
        "doc_count" : 2 
       }, 
       "other" : { 
        "doc_count" : 0 
       } 
       } 
      } 
      } ] 
     } 
     } 

를?

감사합니다.

관련 문제