Агрегация эластичного поиска по диапазону дат - PullRequest
1 голос
/ 03 июля 2019

Предположим, что для работника отображается следующее:

{
    "Project":
    {
         "startDate":{"type":"Date"},
         "endDate":{"type":"Date"},
         "employees":{"type":"keyword"}
    }
}

Пример данных PFB:

{
    "Project1":
    {
         "startDate":"2019-07-01",
         "endDate":"2019-07-03"
         "employees":["emp1","emp2"]
    }
},
{
    "Project2":
    {
         "startDate":"2019-07-02",
         "endDate":"2019-07-04"
         "employees":["emp3","emp4"]
    }
}

Здесь сотрудники имеют список сотрудников, работающих над этим проектом.Я не могу написать запрос агрегации, который дает мне количество сотрудников, работающих каждый день.т.е. сотрудник работает, когда у него есть один или несколько проектов, имеющих startdate <= currentDate и endDate> = currentDate.

Я хочу получить следующий результат:

{
    {
     "key":"2019-07-01",
     "EmployeeCount":2
    },
    {
     "key":"2019-07-02",
     "EmployeeCount":4
    },
    {
     "key":"2019-07-03",
     "EmployeeCount":4
    },
    {
     "key":"2019-07-04",
     "EmployeeCount":2
    }
}

Можете ли вы указать мне, какая агрегация будетпомочь мне решить это?

1 Ответ

2 голосов
/ 03 июля 2019

Боюсь, то, что вы ищете, невозможно.

Elasticsearch не поддерживает агрегацию date histogram таким образом, чтобы получить значение из двух разных полей даты, которые в вашем случае равны startDate и endDate.

Единственный способ получить то, что вы хотите:

  • Получить количество сотрудников при выполнении агрегирования на startDate
  • Получить количество сотрудников при выполнении агрегирования на endDate
  • Управляйте логикой для суммирования результатов на вашем сервисном уровне.

Ниже приведен пример агрегации для расчета количества сотрудников с использованием startDate.

Индекс выборки

PUT mysampleindex
{  
  "mappings": {
    "properties": {  
       "project":{
         "properties": { 
            "startDate":{  
               "type":"date"
            },
            "endDate":{  
               "type":"date"
            },
            "employees":{  
               "type":"keyword"
            }
         }
      }
    }
  }
}

Образцы документов

POST mysampleindex/_doc/1
{
    "project":
    {
         "startDate":"2019-07-01",
         "endDate":"2019-07-03",
         "employees":["emp1","emp2"]
    }
}

POST mysampleindex/_doc/2
{
    "project":
    {
         "startDate":"2019-07-02",
         "endDate":"2019-07-04",
         "employees":["emp3","emp4"]
    }
}

Запрос агрегации:

POST mysampleindex/_search
{
  "size": 0, 
  "aggs": {
    "mydates": {
      "date_histogram": {
        "field": "project.startDate",
        "interval": "day",
        "format" : "yyyy-MM-dd"
      },
      "aggs": {
        "emp_count": {
          "value_count": {
            "field": "project.employees"
          }
        }
      }
    }
  }
}

Обратите внимание, что я использовал агрегацию date histogram с интервалом day вместе с агрегацией value_count для employees в качестве дочерней агрегации.

Результат запроса:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "mydates" : {
      "buckets" : [
        {
          "key_as_string" : "2019-07-01",
          "key" : 1561939200000,
          "doc_count" : 1,
          "emp_count" : {                        <---- Count of employees
            "value" : 2
          }
        },
        {
          "key_as_string" : "2019-07-02",
          "key" : 1562025600000,
          "doc_count" : 1,
          "emp_count" : {                         <---- Count of employees
            "value" : 2
          }
        }
      ]
    }
  }
}

Аналогичным образом можно подсчитать сотрудников для endDate (просто замените startDate на endDate в приведенном выше запросе агрегации). Как только вы получите оба результата, вы можете выполнить добавление того, что вы ищете, на вашем уровне обслуживания.

Хотя технически это не так, я просто надеюсь, что это поможет!

...