真实用两条只相差2小时的文档验证date_histogram按UTC和按+08:00时区分天的真实差异,证明time_zone参数如何实际改变一天的边界位置,影响统计出来的doc_count分布。
代码真实索引2条关键文档: {"ts":"2024-01-15T23:30:00Z"} / {"ts":"2024-01-16T01:30:00Z"} (两条文档真实只相差2小时,都在UTC午夜前后) POST /dh_test/_search {"aggs":{"d":{"date_histogram":{"field":"ts","calendar_interval":"day"}}}} POST /dh_test/_search {"aggs":{"d":{"date_histogram":{"field":"ts","calendar_interval":"day","time_zone":"+08:00"}}}}
不指定时区(默认UTC): → 2024-01-15T00:00:00.000Z doc_count=1 ← 23:30这条真实落进了15号这一天 → 2024-01-16T00:00:00.000Z doc_count=1 ← 01:30这条真实落进了16号这一天
这个结果真实符合直觉:按UTC时间划分天的边界,2024-01-15T23:30:00Z真实在15号这一天的最后半小时里,2024-01-16T01:30:00Z真实已经跨过了午夜进入16号,两者分别落进了相邻但不同的两个桶,哪怕它们之间真实只相差2个小时。
time_zone:+08:00: → 2024-01-16T00:00:00.000+08:00 doc_count=2 ← 两条文档真实都被分进了同一个桶!
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
date_histogram 聚合与 time_zone 参数