Date 如何在elasticsearch中创建考虑日期范围的直方图 问题
我有以下模式中的数据:Date 如何在elasticsearch中创建考虑日期范围的直方图 问题,date,elasticsearch,range,histogram,Date,elasticsearch,Range,Histogram,我有以下模式中的数据: { start_date: '2017-01-01', end_date: '2017-01-05', }, { start_date: '2017-01-03', end_date: '2017-01-07', } 我试图每天创建一个柱状图,如果某个特定文档的开始日期和结束日期在当天重叠,该柱状图将为我提供帮助 有了关于的数据,输出桶将是: { "2017-01-01": { "doc_count": 1 }, "2017-01-02": {
{
start_date: '2017-01-01',
end_date: '2017-01-05',
},
{
start_date: '2017-01-03',
end_date: '2017-01-07',
}
我试图每天创建一个柱状图,如果某个特定文档的开始日期和结束日期在当天重叠,该柱状图将为我提供帮助
有了关于的数据,输出桶将是:
{
"2017-01-01": { "doc_count": 1 },
"2017-01-02": { "doc_count": 1 },
"2017-01-03": { "doc_count": 2 },
"2017-01-04": { "doc_count": 2 },
"2017-01-05": { "doc_count": 2 },
"2017-01-06": { "doc_count": 1 },
"2017-01-07": { "doc_count": 1 }
}
在阅读了所有elasticsearch聚合文档之后,我不认为这是可能的。感谢您的帮助
解决方案 根据Olivier下面的回答,我做了以下工作: 创建助手函数以生成开始日期和结束日期之间的全包日期:
const generateDateRange = (start, end) => {
const startDate = moment(start);
const endDate = moment(end);
const range = [];
const date = startDate;
while (date.isSameOrBefore(endDate)) {
range.push(date.format('YYYY-MM-DD'));
date.add(1, 'day');
}
return range;
};
创建了一个助手函数,以根据日期范围生成聚合所需的所有筛选器:
const generateActivityFilters = (range, options = {}) => {
const filters = {};
range.map((date) => {
filters[date] = {
bool: {
filter: [
{ range: { [options.start]: { lte: date } } },
{ range: { [options.end]: { gte: date } } },
],
},
};
return true;
});
return filters;
};
最后,按如下方式运行查询:
{
"size": 0,
"aggs": {
"date_histo": {
"filters": {
"filters": filters // from generateActivityFilters
}
}
}
}
我所看到的唯一替代方法是可能在
脚本中执行整个操作,但在玩了几个小时elasticsearch脚本后,我放弃了这种方法。我发现这个问题非常有趣
个人搜索并没有提供一种合理的方法来实现这一点,原因之一是如何定义日期直方图的开始和结束日期(因为它通常使用字段参数来计算)
使用bucket和pipeline聚合的更高级的人可能能够提供帮助,但我最接近的方法是通过“欺骗”和构建过滤器聚合来实现目标:
{
"size": 0,
"aggs": {
"date_histo": {
"filters": {
"filters": {
"2017-01-01": {
"bool": {
"filter": [
{"range": {"start_date": {"lte": "2017-01-01"}}},
{"range": {"end_date": {"gte": "2017-01-01"}}}
]
}
},
"2017-01-02": {
"bool": {
"filter": [
{"range": {"start_date": {"lte": "2017-01-02"}}},
{"range": {"end_date": {"gte": "2017-01-02"}}}
]
}
},
...
}
}
}
}
}
不是很漂亮,但可能仍然值得考虑作为更好答案的起点。重叠是指它们是相同的吗?类似于{start_date:'2017-01-01',end_date:'2017-01-01'}
我的意思是,给定一些次要的开始和结束日期范围,查找文档的开始和结束日期与其相交的每一天。