无法在 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);
保存在 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);