簡體   English   中英

Elasticsearch按多個字段分組並匯總小時數(總計)

[英]Elasticsearch group by multiple fields and sum the hours (aggregation)

我正在研究Elasticsearch(1.5)查詢,以獲取用戶的所有任務及其在一個時間間隔內的小時數。 例如,2016年1月1日至2016年12月31日。

到目前為止,這是我設法做到的:

{
  "query": {
    "filtered": {
      "query" : {
        "bool" : {
          "must":
          {
            "term": {
              "userId": [1,2,3,4,5,6]
            }
          }
        }
      },
      "filter": {
        "range": {
          "spentOn": {
          "gte": "1451606400000", // 1st Jan 
          "lte": "1483142400000" // 31st Dec
          }
        }
      }
    }
  },
  "size":0,
  "aggs": {
    "group_by_interval": {
      "date_histogram": {
        "field": "spentOn",
        "interval": "month",
        "min_doc_count": 0,
        "extended_bounds": {
          "min": "1451606400000", 
          "max": "1483142400000"
        }
      },
      "aggs": {
        "group_per_project": {
          "histogram": {
            "field": "taskId",
            "interval": 1
          },

          "aggs": {
            "hours": {
              "sum": {
                "field": "hours"

              }
            }
          }
        }
      }
    }
  }
}

上面的查詢給了我以下結果:

{
...
[{
        "key_as_string" : "2016-01-01T00:00:00.000Z",
        "doc_count" : 10,
        "group_per_project" : {
            "buckets" : [{
                    "doc_count" : 1,
                    "key" : Task A,
                    "hours_per_taskAssignment" : {
                        "value" : 5
                    }
                }, {
                    "doc_count" : 15,
                    "key" : Task  B,
                    "hours_per_taskAssignment" : {
                        "value" : 60
                    }
                }, {
                    "doc_count" : 1,
                    "key" :Task  C,
                    "hours_per_taskAssignment" : {
                        "value" : 10
                    }
                }
            ]
        },
        "key" : 1451606400000
    }, {
        "key_as_string" : "2016-02-01T00:00:00.000Z",
        "doc_count" : 23,
        "group_per_project" : {
            "buckets" : [{
                    "doc_count" : 1,
                    "key" : Task A,
                    "hours" : {
                        "value" : 2
                    }
                }, {
                    "doc_count" : 20,
                    "key" : Task B,
                    "hours" : {
                        "value" : 180
                    }
                }
            ]
        },
        "key" : 1454284800000
    }
...
]

但是,我需要由用戶對小時進行分組和匯總,而不是對所有用戶小時進行匯總。 例如在一月份:

{
 "doc_count" : 2,
 "key" : Task A,
 {
    "userId": 1
    "hours": {"value": 2}
 },
  {
    "userId": 2
    "hours": {"value": 5}
 }
}

我有什么方法可以使用ElasticSearch 1.5達到上述結果,而不必遍歷每個用戶並獲取總工作時間,從而降低應用程序的性能?

提前致謝!

  "aggs": {
    "group_by_interval": {
      "date_histogram": {
        "field": "spentOn",
        "interval": "month",
        "min_doc_count": 0,
        "extended_bounds": {
          "min": "1451606400000",
          "max": "1483142400000"
        }
      },
      "aggs": {
        "group_per_project": {
          "histogram": {
            "field": "taskId",
            "interval": 1
          },
          "aggs": {
            "per_user": {
              "terms": {
                "field": "userId"
              },
              "aggs": {
                "hours": {
                  "sum": {
                    "field": "hours"
                  }
                }
              }
            }
          }
        }
      }
    }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM