无法在 ElasticSearch 查询中正确过滤时间

Not able to filter time correctly in ElasticSearch query

保存在 ES 中的记录有一个名为 updated_at 的字段,它以纪元存储时间。 在我的搜索查询中,我根据 'yyyy-mm-dd' 格式过滤日期,如下所示:

{
  "query": {
    "bool": {
      "must": [
        {
          "nested": {
            "query": {
              "bool": {
                "filter": [
                  {
                    "range": {
                      "segment_status.updated_at": {
                        "from": "2022-05-16",
                        "to": "2022-05-16",
                        "include_lower": true,
                        "include_upper": true,
                        "boost": 1
                      }
                    }
                  }
                ],
                "adjust_pure_negative": true,
                "boost": 1
              }
            },
            "path": "segment_status",
            "ignore_unmapped": false,
            "score_mode": "avg",
            "boost": 1
          }
        }
        ]
    }
  }
        
}

我的时区是 GMT+05:30。我保存了一条纪元时间为 1652733000 的记录,结果显示是 5 月 17 日上午 2:00 左右。使用上面的 ES 查询,我达到了这个记录,我假设这是因为格林威治标准时间是 5 月 16 日。

请验证这一点,如果在生成查询的代码中有解决此问题的解决方法,那将会很有帮助。

你是对的,自纪元评估 2022 年 5 月 16 日星期一以来的毫秒数 8:30:00 UTC 时间下午。如果您想让用户能够在他们自己的时区按日期搜索,您就必须停止考虑您自己的时区。如果您可以访问日期作为 LocalDate 对象和用户的时区,则可以使用自纪元以来的毫秒数对 elasticsearch 进行查询:

LocalDate date = ...
Instant startOfDay = date.atStartOfDay(userZoneId).toInstant();
Instant endOfDay = startOfDay.plusMillis(3600 * 24 * 1000 - 1);