Гистограмма даты Elasticsearch с указанием количества документов на определенный момент времени

Я пытаюсь создать гистограмму дат, показывающую количество сотрудников по месяцам.

Сопоставление сотрудников выглядит примерно так:

{
    "number": 1234,
    "firstName": "Chris",
    "lastName": "Smith",
    "employmentDates: [
        {
            "startDate": "2014-10-03T06:00:00Z",
            "endDate": "2017-11-04T06:00:00Z"
        }
    ],
    "lastPaidOnDate": "2017-11-10T06:00:00Z",
    ....
}

Учитывая такой сценарий начала и конца (для трех сотрудников):

|----------------|
       |-----------------------------|
  |---|    |---------------------|
 ^   ^   ^   ^   ^   ^

Я ожидал, что гистограмма будет похожа на это:

"aggregations": {
    "employees_per_month": {
        "buckets": [
            {
                "key_as_string": "2017-01-01",
                "doc_count": 1
            },
            {
                "key_as_string": "2017-02-01",
                "doc_count": 2
            },
            {
                "key_as_string": "2017-03-01",
                "doc_count": 2
            },
            {
                "key_as_string": "2017-04-01",
                "doc_count": 3
            },
            {
                "key_as_string": "2017-05-01",
                "doc_count": 3
            },
            {
                "key_as_string": "2017-06-01",
                "doc_count": 2
            }
        ]
    }
}

Похоже, мне нужно создать субагрегацию в скриптовом поле, но я не уверен, с чего начать.

Ваша помощь очень ценится.


person brentlemons    schedule 18.11.2017    source источник


Ответы (1)


Я считаю, что это можно сделать с помощью DateHistogram. Но я предлагаю простой подход. Вам нужно будет запускать запрос каждый раз для одного конкретного месяца:

{
  "size": 0,
  "aggregations": {
    "bool_agg": {
      "filter": {
        "bool": {
          "must": [
            {
              "range": {
                "employmentDates.startDate": {
                  "lt": "2017-12-01T00:00:00Z"
                }
              }
            },
            {
              "range": {
                "employmentDates.endDate": {
                  "gte": "2017-11-01T00:00:00Z"
                }
              }
            }
          ]
        }
      },
      "aggregations": {
        "distinct_agg": {
          "cardinality": {
            "field": "number"
          }
        }
      }
    }
  }
}

Обратите внимание, что если employmentDates будет содержать более одной записи, например:

"employmentDates: [
   {
      "startDate": "2014-10-03T06:00:00Z",
      "endDate": "2017-11-04T06:00:00Z"
   }
   {
      "startDate": "2018-03-03T06:00:00Z",
      "endDate": "2018-07-04T06:00:00Z"
   }

Вы должны быть вложенными с вложенным типом данных, например можно найти здесь. И обновите запрос на:

{
  "size": 0,
  "aggregations": {
    "nested_agg": {
      "nested": {
        "path": "employmentDates"
      },
      "aggregations": {
        "bool_agg": {
          "filter": {
            "bool": {
              "must": [
                {
                  "range": {
                    "employmentDates.startDate": {
                      "lt": "2017-12-01T00:00:00Z"
                    }
                  }
                },
                {
                  "range": {
                    "employmentDates.endDate": {
                      "gte": "2017-11-01T00:00:00Z"
                    }
                  }
                }
              ]
            }
          },
          "aggregations": {
            "comment_to_issue": {
              "reverse_nested": {},
              "aggregations": {
                "distinct_agg": {
                  "cardinality": {
                    "field": "number"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
person Eli    schedule 19.11.2017