Elasticsearch: агрегирование документов на основе диапазона дат
У меня есть набор документов в ElasticSearch 5.5 с двумя полями даты: start_date и end_date. Я хочу объединить их в сегменты гистограммы даты (например, еженедельно), так что если start_date Рассмотрим следующий конкретный пример: у меня есть набор документов, описывающих сотрудников компании, и для каждого сотрудника у вас есть дата найма и (необязательно) дата увольнения. Я хочу построить гистограмму даты численности активных сотрудников за 12 месяцев. Пример документа: Есть ли способ сделать это в ES?{
"start_date": "2013-01-12T00:00:00.000Z",
"end_date": "2016-12-08T00:00:00.000Z",
"id": "123123123"
}
1 ответ
Я нашел один способ сделать это, используя фильтры агрегации ( https://www.elastic.co/guide/en/elasticsearch/reference/master/search-aggregations-bucket-filter-aggregation.html). Если мне нужен, скажем, отчет за 12 завершающих месяцев, то я бы создал 12 сегментов, где каждый блок определяет условия фильтра, такие как:
"bool":{
"must":[{
"range":{
"start_date":{
"lte":"2016-01-01T00:00:00.000Z"
}
}
},{
{
"range":{
"end_date":{
"gt":"2016-02-01T00:00:00.000Z"
}
}
}]
}
Тем не менее, я чувствую, что было бы неплохо, если бы существовал более простой способ сделать это, поскольку, если я хочу, скажем, завершить 365 дней, это означает, что мне нужно создать 365 фильтров корзины, что делает результирующий запрос очень большим.
Я знаю, что этот вопрос довольно старый, но, поскольку он все еще открыт, я делюсь своими знаниями по этому поводу. Кроме того, в этом вопросе четко не объясняется, какой результат ожидается, но все же я думаю, что этого можно достичь с помощью "агрегирования гистограммы даты" и "агрегирования сценария ведра".
Вот ссылки на документацию для обоих этих агрегатов.