Elasticsearchの新しいJavaクライアント(2024年3月版)

Posted by johtani on Thursday, March 21, 2024

目次

以前、Elasticsearchの新しいJavaクライアントについてブログを書きました

あれから、ほぼ2年経ちましたが、差分を調べたのでブログに残しておきます。

前回の問題点

前回のブログを書いている時点では、2点ほど気になることがありました。それぞれ解決しているので、まずはその紹介をしようと思います。

どんなリクエストを投げているかが不明

Elasticsearchの公式ドキュメントでは、各エンドポイントやクエリの書き方の紹介では、JSONのサンプルが紹介されています。 自分で書いたリクエストが想定した形になっているか?、プログラムで書いたクエリがJSONだとどんな形になっているか?というのを確認したくなります。 前回記事を書いた時点では、JSON文字列にするためにJsonGeneratorを利用していくつか処理を書く必要がありました。 こんな感じに。

    private void printRequestBodyJsonForDebug(RequestBase request) {
        //for debug
        Logger.log("** Debug print start **");
        StringWriter writer = new StringWriter();
        SimpleJsonpMapper mapper = new SimpleJsonpMapper();
        JsonGenerator generator = mapper.jsonProvider().createGenerator(writer);
        mapper.serialize(request, generator);
        generator.close();
        Logger.log(writer.toString());
        Logger.log("** Debug print finish **");
    }

v8.3から、各種RequestクラスにtoString()メソッドが実装され、簡単にJSON文字列が取り出せるようになっています。

    private void printRequestBodyJsonForDebug(RequestBase request) {
        //for debug
        Logger.log("** Debug print start **");
        Logger.log(request.toString());
        Logger.log("** Debug print finish **");
    }

実際の出力内容は次のようになります。

PutIndexTemplateRequest: PUT /_index_template/wikipedia-index-template {"index_patterns":["wikipedia-*"],"template":{"mappings":{"properties":{"images":{"type":"nested","properties":{"target_type":{"type":"keyword"},"link_target":{"type":"keyword"},"taget":{"type":"keyword"},"text":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}},"analyzer":"kuromoji"}}},"contents":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}},"analyzer":"kuromoji"},"headings":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}},"analyzer":"kuromoji"},"links":{"type":"nested","properties":{"link_target":{"type":"keyword"},"text":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}},"analyzer":"kuromoji"}}},"id":{"type":"keyword"},"categories":{"type":"keyword"},"title":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}},"analyzer":"kuromoji"},"revision_id":{"type":"keyword"},"timestamp":{"type":"date"}}},"settings":{"number_of_shards":"3","number_of_replicas":"0","refresh_interval":"0"}}}

最初にクラス名: があり、移行がKibanaのDev Toolですぐ使える形式になっています (リクエストボディのJSONの前で改行するだけ)。 デバッグや確認などが簡単にできそうですね。

変更された時のPull Requestは次のものになります。

プラグインなどで提供されるクエリが書けない

Elasticsearchはプラグインを使って拡張することができ、LtRプラグインなどでは、クエリの拡張が行われています。

以前調査したタイミングではelasticsearch-specificationで定義されたリクエストしか受け取れない実装になっていました。 v8.5(実際には8.4.xにバックポートされている)からは、プラグインなどが追加しているクエリなどのカスタムな記述ができるようになっています。

_custom()というメソッドが各所に追加されており、これを利用することで定義にないJSONの属性などが追加できるようになっています。 公式ドキュメントにも利用方法が追加されています。

レスポンスでも同様に_custom()が追加されており、プラグイン独自のレスポンス形式などにも対応できます。

変更された時のPull Requestは次のものになります。

それ以外に変更されたポイント

各バージョンで導入された変更点がリリースハイライトとしてドキュメントにまとめてあります。 いくつかピックアップして簡単に紹介します。

BulkIngesterヘルパーの追加(8.7)

Bulk APIをより楽に利用することができるヘルパークラスです。Pythonのクライアントにあったstreaming_bulkなどに似ています。 どのくらいの数・サイズの操作をまとめて送るか、定期的にrefreshするのか?などを設定してインスタンスを作った後は、インスタンスにadd()していくと、指定されたタイミングで定期的にBulkのリクエストを送信してくれます。 自分でループを回しながら定期的にAPIをたたくよりも便利です。 詳細についてはドキュメントがあるので参考にしてください。

OpenTelemetry対応(8.10)

OpenTelemetryを利用してトレースすることができるようになっています。JavaクライアントからEsへのHTTPのリクエストの処理時間やリクエスト本体をスパンに含めてくれるようになっています。 自分たちのプロジェクトがOpenTelemetryを利用していれば、Esのリクエストに関連する部分が追加でとれるようになっています。 詳細は公式ドキュメントに利用方法が記載されています。

まとめ

約2年ぶり触ってみると、さらに便利になっていました。 前回はカスタムパラメータが利用できないなど、切り替えできない可能性もありましたが、だいぶ問題点は減っていそうです。

とはいえ、利用しようとしている機能が使えない、バグなどがあるかもしれないので、何か気になる点があった場合は、Issueのリストをチェックするのがいいでしょう。

とくに、新しくElasticsearchでリリースされたけど、Javaクライアントにはまだ利用できないパラメータなどが時々あります。 ということで、簡単ですが補足情報でした。

参考


comments powered by Disqus

See Also by Hugo


Related by prelims-cli