2017-03-02 3 views
0

내 지수의 다음과 같은 스타일의 문서가 :Elasticsearch 쿼리

{ 
    "docType": { 
    "valuesOverTime": [ 
     { 
      "begin": 1488442858570, 
      "end": 1488442860570, 
      "values": [ 
       { 
        "name": "level", 
        "segCount": 4 
       } 
      ] 
     }, 
     { 
      "begin": 1488442860571, 
      "end": 1488442890592, 
      "mcdn": [ 
       { 
        "name": "level", 
        "segCount": 10 
       } 
      ] 
     }, 
     { 
      "begin": 1488442890593, 
      "end": 1488442890600, 
      "mcdn": [ 
       { 
        "name": "level", 
        "segCount": 7 
       } 
      ] 
     } 
    ] 
    } 
} 

을 일정 시간 범위에서 docType.valuesOverTime.values.segCount의 합계를 조회 할 다음 범위처럼

{ 
    "range": { 
    "docType.valuesOverTime.begin": { 
     "gte": 1488442858570, 
     "lte": 1488442860571 
    } 
    } 
}, 
{ 
    "range": { 
    "docType.valuesOverTime.end": { 
     "gte": 1488442860570, 
     "lte": 1488442890592 

    } 
    } 
} 

나에게 처음 두 항목의 합계를 얻어야한다 : (14)

를 내가 쿼리 권리를 얻는 절대적으로 붙어입니다 그러나! 이 경우에는 docType.valueOverTime.values.segCount의 모든 항목의 합이 21이됩니다.

나는 다음과 같은 쿼리와 그들에 대한 몇 가지 변화를 시도하는 경우 물론 모든 잘못 :

{ 
    "size": 0, 
    "aggs": { 
     "myfilter": { 
      "filter": { 
      "bool": { 
       "must": [ 
       { 
        "range": { 
        "docType.valuesOverTime.begin": { 
         "gte": 1488442858570, 
         "lte": 1488442860571 
        } 
        } 
       }, 
       { 
        "range": { 
        "docType.valuesOverTime.end": { 
         "gte": 1488442860570, 
         "lte": 1488442890592 

        } 
        } 
       }     
       ] 
      } 
      }, 
      "aggs": { 
      "summe": { 
       "sum": { 
       "field": "docType.valuesOverTime.values.segCount" 
       } 
      } 
      } 
     } 
    } 
} 

{ 
    "_source": "docType.valuesOverTime.values", 
    "query": { 
    "constant_score" : { 
     "filter" : { 
     "bool": { 
      "must": [ 
      { 
       "range": { 
       "docType.valuesOverTime.begin": { 
        "gte": 1488442858570, 
        "lte": 1488442860571 
       } 
       } 
      }, 
      { 
       "range": { 
       "docType.valuesOverTime.end": { 
        "gte": 1488442860570, 
        "lte": 1488442890592 

       } 
       } 
      } 

      ] 
     } 
     } 
    } 
    }, 
    "aggs": { 
    "summe": { 
     "sum": { 
     "field": "docType.valuesOverTime.values.segCount" 
     } 
    } 
    } 
} 

누군가가 내가 잘못 잡았는지 말해 주시겠습니까? 그리고 그것을 올바르게하는 방법!

내가 나 자신을 해결

"valuesOverTime": { 
    "properties": { 
     "begin": { 
     "type": "long" 
     }, 
     "end": { 
     "type": "long" 
     }, 
     "values": { 
     "properties": { 
      "name": { 
      "type": "keyword" 
      }, 
      "segCount": { 
      "type": "long" 
      } 
     } 
     } 
    } 
} 

답변

0

다음 매핑 ES 5.2.2에서 작업 :

먼저 valuesOverTime의 모든 매핑이

"valuesOverTime": { 
    "type": nested" 
    "properties": { 
     "begin": { 
     "type": "long" 
     }, 
     "end": { 
     "type": "long" 
     }, 
     "values": { 
     "properties": { 
      "name": { 
      "type": "keyword" 
      }, 
      "segCount": { 
      "type": "long" 
      } 
     } 
     } 
    } 
} 
처럼 보이도록, 중첩 될 필요가

다음과 같이 쿼리 할 수 ​​있습니다.

{ 
    "size": 0, 
    "aggs": { 
    "nestedAcq": { 
     "nested": {"path": "docType.valuesOverTime"}, 
     "aggs": { 
     "rangeAcq": { 
      "range": { 
      "field": "ocType.valuesOverTime.begin", 
      "ranges": [ 
       { 
       "from": 1488442858570, 
       "to": 1488442860572 
       } 
      ] 
      }, 
      "aggs": { 
      "theSum": { 
       "sum": {     
       "field": "docType.valuesOverTime.values.segCount" 
       } 
      } 
      } 
     } 
     } 

    } 
    } 
} 

및 받기

"theSum": { 
    "value": 14 
}