Skip to content

Instantly share code, notes, and snippets.

@ijokarumawak
Last active February 23, 2021 12:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ijokarumawak/74b5a777c247c3990dd11016477505d7 to your computer and use it in GitHub Desktop.
Save ijokarumawak/74b5a777c247c3990dd11016477505d7 to your computer and use it in GitHub Desktop.
Painless examples

Painless Examples

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"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment