Elasticsearchでは現在時刻を基準に範囲検索することが可能です。
公式ドキュメントを見ながら範囲検索について少し検証してみたのでそのメモです。
環境
Elasticsearch 6.4.0
検索対象として以下のようなデータを準備しておきます。
{"date": "2018-09-30T00:00:00+09:00"},
{"date": "2018-09-30T00:01:00+09:00"},
...
{"date": "2018-09-30T23:59:00+09:00"}
日付計算に利用できるパラメータ
日付計算には以下のパラメータを利用できます。
パラメータ | 意味 |
---|---|
now | 現在時刻 |
y | 年 |
M | 月 |
w | 週 |
d | 日 |
h/H | 時 |
m | 分 |
s | 秒 |
参考:Date Math
現在時刻から加減算する
now
に対して+
または-
することで、現在時刻に対して加減算を行うことが出来ます。
複数のパラメータを利用したい場合は、それぞれに対して+
または-
を指定してください。
{
"query": {
"range": {
"date": {
"gte": "now",
"lt": "now+1h"
}
}
}
}
{
"query": {
"range": {
"date": {
"gte": "now-2h-30m",
"lt": "now"
}
}
}
}
現在時刻から月や日の初めを計算する
now
に対して/
の後ろにパラメータを指定することで、そのパラメータの初めの日時を計算することが出来ます。
例えば、/d
を指定した場合は今日の00:00:00.000になります。
ただし、Elasticsearchは時刻をUTCで扱っていますので、JSTの場合は"time_zone": "+09:00"
を指定しないとJSTに変換された結果、今日の09:00:00.000を指定したことになってしまいますので注意してください。
{
"query": {
"range": {
"date": {
"gte": "now/M",
"time_zone": "+09:00"
}
}
}
}
{
"query": {
"range": {
"date": {
"gte": "now/d",
"lt": "now",
"time_zone": "+09:00"
}
}
}
}
特定の時刻を指定する
現在時刻から特定の時刻(例えば12時など)を指定する場合、日の始めの計算と時刻の加算を組み合わせることで実現できます。
{
"query": {
"range": {
"date": {
"gte": "now/d+12h",
"time_zone": "+09:00"
}
}
}
}
これをKibanaのフィルターとして設定すれば、VisualizeやDashboardを開いた時刻を基準に特定時刻のデータを利用することが出来ます。
例えば、Visualizeで前日の12:00から今日の12:00までのデータを利用したい場合、以下のクエリをフィルターとして設定することで、Visualizeを開いた日を基準に対象データを絞り込むことが出来ます。
{
"query": {
"range": {
"date": {
"gte": "now-1d/d+12h",
"lt": "now/d+12h",
"time_zone": "+09:00"
}
}
}
}