Elasticsearch 7.11 から Runtime Field が使えるようになったり (まだ Beta だけど)、 Kibana の Painless Lab でオートコンプリートが使えたりするので、 Painless の出番は今後ますます増えてくるでしょう。練習も兼ねて、使えそうなスニペットをまとめていきたいと思います。
7.12 で Grok と Dissect が使えるようになるみたい、楽しみだ!
Elasticsearch 7.11 から Runtime Field が使えるようになったり (まだ Beta だけど)、 Kibana の Painless Lab でオートコンプリートが使えたりするので、 Painless の出番は今後ますます増えてくるでしょう。練習も兼ねて、使えそうなスニペットをまとめていきたいと思います。
7.12 で Grok と Dissect が使えるようになるみたい、楽しみだ!
// date フィールドの値から曜日を取得 | |
// doc['@timestamp'].value すると、 JodaCompatibleZonedDateTime 型になるのだが、これはほぼ ZonedDateTime と等価。 | |
// Painless Lab でテストする場合は ZonedDateTime.parse を使うと便利。 | |
ZonedDateTime.parse("2021-02-23T20:06:00+09:00").dayOfWeek.getDisplayName(TextStyle.SHORT, Locale.JAPAN) |
Painless でコーディングするときに困るのが、その変数は一体何の型なのかわからないということである。 クラスが分かれば API 仕様書を見たり、該当クラスのソースコードを見たりして対応できる。 ここではフィールドのクラスをチェックする方法を紹介。
対象フィールドの value に対して .class
でアクセスしてみる。これは getClass()
を呼び出してくれればいいのだけど、 Painless では当該メソッドは利用できないみたい。でも大丈夫。とりあえずこんな風に書く:
PUT runtime-field-sample
{
"mappings": {
"dynamic": "runtime",
"runtime": {
"day_of_week": {
"type": "keyword",
"script": {
"source": "emit(doc['@timestamp'].value.class)"
}
}
},
"properties": {
"@timestamp": {"type": "date"}
}
}
}
そして、ドキュメントを登録:
PUT runtime-field-sample/_doc/1
{
"@timestamp": "2021-02-23T00:00:00+09:00"
}
で、 Runtime Field を取得してみる:
GET runtime-field-sample/_search
{
"fields": ["@timestamp", "day_of_week"]
}
すると、次のようなエラーが返ってくる。 getClass()
は呼び出せないのだが、エラーメッセージ内にクラス名
org.elasticsearch.script.JodaCompatibleZonedDateTime
が返ってくるので、 date
方のフィールドの値は JodaCompatibleZonedDateTime
なんだとわかる:
"caused_by" : {
"type" : "illegal_argument_exception",
"reason" : "dynamic getter [org.elasticsearch.script.JodaCompatibleZonedDateTime, class] not found"
}