2016-08-09 10 views
1

Ich arbeite an einer Elasticsearch (1.5) Abfrage, um alle Aufgaben für Benutzer und ihre jeweiligen Stunden innerhalb eines Zeitintervalls zu erhalten. Zum Beispiel, 1. Januar 2016 - Dec 31 2016.Elasticsearch Gruppe von mehreren Feldern und Summe der Stunden (Aggregation)

Dies ist, was ich habe es geschaffen, so weit zu kommen:

{ 
    "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" 

       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Die obige Abfrage mir folgendes Ergebnis liefert:

{ 
... 
[{ 
     "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 
    } 
... 
] 

jedoch Ich brauche die Stunden, die vom Benutzer gruppiert und summiert werden, anstatt eine Zusammenfassung aller Benutzerstunden. Zum Beispiel im Januar:

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

Gibt es eine Möglichkeit, das obige Ergebnis Elasticsearch mit erreichen könne 1,5 ohne den Umweg über jeden einzelnen Benutzer zu Schleife und die Gesamtstunden erhalten und dabei die Leistung der Anwendung zu reduzieren?

Vielen Dank im Voraus!

Antwort

1
"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" 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
+0

Hallo Andrei, vielen Dank für Ihre Antwort. Ich habe deine Lösung ausprobiert und es gibt mir folgendes für userId: "key": "\ u0001 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0000 \ u0012 \ fb". Nach einigen Recherchen fand ich, dass dies ein Problem mit älteren Versionen ist (https://github.com/elastic/elasticsearch/issues/8614). Weißt du, wie das mit ES 1.5 gelöst werden kann? Danke ist Fortschritt. – Saurabh

+0

Oh, das :-). Ja, verschiedene Typen mit den gleichen Feldern und verschiedenen Feldtypen können verschiedene Arten von Problemen verursachen. In 2.x gibt es eine spezielle Überarbeitung, um diese Situationen zu eliminieren (aggressive Umsetzung der Zuordnungsregeln). Also, Sie haben einen Index mit mehreren Typen, die 'userId' Felder haben, die sowohl numerisch als auch' string' sind? –

+0

Danke Andrei, für Ihre Antwort. Es funktionierte. :) Ich habe das Problem für den Umgang mit mehreren Typen behoben, indem ich die numerische Version von userId angegeben habe. Sobald die Abfrage geändert wurde, funktionierte es wunderbar. Danke noch einmal. – Saurabh

Verwandte Themen