使用无痛聚合一年中的一周

时间:2018-07-17 05:47:55

标签: c# elasticsearch elasticsearch-painless

在按“年度最佳”数字汇总数据时,我面临挑战。

用例是: 在我的PC上将一周的第一天设置为星期日。 创建数据范围:

开始= '2018-06-24周日'和结束= '2018-06-30周六'

预期:我只能看到一个星期的汇总

实际:我可以看到两个星期的汇总情况

弹性查询:

{
  "size": 0,
  "aggs": {
    "groupby": {
      "terms": {
        "script": {
          "source": "ZonedDateTime.ofInstant(Instant.ofEpochMilli(doc['CLOSED_DATE'].value.millis), ZoneId.of('UTC')).get(IsoFields.WEEK_OF_WEEK_BASED_YEAR)"
        },
        "size": 100
      }
    }
  },
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "CLOSED_DATE": {
              "gte": "2018-06-24T00:00:01",
              "lte": "2018-06-30T23:59:59",
              "time_zone": "UTC"
            }
          }
        }
      ]
    }
  }
}

我也尝试过此方法,并得到了相同的结果:

{
  "size": 0,
  "aggs": {
    "groupby": {
      "terms": {
        "script": {
          "source": "doc['CLOSED_DATE'].value.getWeekOfWeekyear()"
        },
        "size": 100
      }
    }
  },
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "CLOSED_DATE": {
              "gte": "2018-06-24T00:00:01",
              "lte": "2018-06-30T23:59:59",
              "time_zone": "UTC"
            }
          }
        }
      ]
    }
  }
}

为了公平起见,此查询在大多数用例中都可以正常使用。 像上面这种用例这样的场景是失败的。

任何提示都会受到欢迎!!! 谢谢

1 个答案:

答案 0 :(得分:0)

这可以解决问题:

def date = ZonedDateTime.ofInstant(Instant.ofEpochMilli(doc[params.dt_field_name].value), ZoneId.of(params.timezone)); DayOfWeek dayOfWeek = DayOfWeek.valueOf(params.first_day_week); date = date.with(TemporalAdjusters.previousOrSame(dayOfWeek)).plusWeeks(1); return date.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);