elasticsearch,range,histogram,Date,elasticsearch,Range,Histogram" /> elasticsearch,range,histogram,Date,elasticsearch,Range,Histogram" />

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'}
我的意思是,给定一些次要的开始和结束日期范围,查找文档的开始和结束日期与其相交的每一天。