Elastic stack AdventCalendar 19 日 になります。
Kibana の DevTools でクエリを実行するのと同じことを emacs の中から実行する話です。
はじめに
elastic emacs というキーワードでグーグル検索をすると、上位に Classmethod さんのインタビュー記事が出てきます。
この中で開発環境について、こんなくだりがあります。
CM「開発ツールにはどのようなものを利用していますか?」
Ryanさん「エディターはIntelliJ、Eclipseを利用しているメンバーが多い。中にはEmacs使いもいる。Emacs使いは開発だけではなく、メールなどの業務も全てEmacsでこなしている(笑)」
emacs でメールを読み書きしている私はとても親近感を感じます(笑)。
閑話休題
Elastic Stack はオープンソースのプロジェクトですので、 github でソースコードが公開されています。
試しに elastic/elasticsearch を見てみると、一番上のディレクトリに.dir-locals.el というファイルがあり、emacs の java-mode のカスタマイズが設定されています。もしかするとインタビューで話題になっていた方が、このファイルの主なんじゃないかと勝手に想像してます。その dakroneさんのリポジトリには elasticsearchを emacs から操る es-mode が公開されています。(ありがたや〜)
本編
前置きが長かったですが、本編は短いです。
An Emacs major mode for interacting with Elasticsearch
この es-mode を emacs に追加すると、Kibanaの Dev Tools でクエリを書いて実行するように、emacs buffer から RestAPI を実行できるようになります。
こんなふうに↓ Elasticsearch のクエリをファイルに列挙しておき、実行したいクエリの上にカーソルを置き、そこで Ctrl-c を 2 回押すと、結果の json が別の buffer に表示されます。
Kibana の DevTools に比べて何か利点があるか?と自問自答してみると、
クエリをファイルに保存しておけば、DevTools にコピペしなくても、すぐ実行でき、エディタの中で完結している、といったところでしょうか。
org-mode
また、emacs には org-mode という、独自の markdown 的な仕組み(モード)があります。es-mode がセットアップされた状態で、org-mode内でクエリを実行すると、同じファイルのRESULTS というブロックが生成され、そこに結果を返してくれます。
検索クエリとその結果を記録しておきたい場合は org-mode の中で es-mode を使うほうが便利でしょう。
↑の gif にもでていますが、json の結果を jq で処理したものを RESULTS で取得することもできます。
#+BEGIN_SRC es :jq ._source.title
GET demo/doc/1?pretty
#+END_SRC
#+RESULTS
: "hello elastic"
es-mode のセットアップについて
公式のREADMEを見てください。
とはいえ、emacs のバージョンや環境によって、うまくセットアップできない場合もあるかもしれません。お試しで es-mode 使うためのDockerfile をつくってみました。コンテナのなかで動いている emacs なので、以下の2点に注意してください。
- endpoint は http://localhost:9200 になっていたら変更する必要があります。endpoint は .emacs ファイルの中で指定することができます。
- Elasticsearch もループバック以外のネットワークからもつながるようになっている必要があります。