Боюсь, то, что вы ищете, невозможно.
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
в приведенном выше запросе агрегации). Как только вы получите оба результата, вы можете выполнить добавление того, что вы ищете, на вашем уровне обслуживания.
Хотя технически это не так, я просто надеюсь, что это поможет!