Kibana4 の Discover 機能で、いろいろな絞り込みをしつつ、データを閲覧している。フィールドを指定し、表形式で表示していると、そのままの状態でダウンロードして、Excel やら Google Spreadsheet へ取り込んで加工したくなる時がある。
そういうニーズに対して Kibana4 本体には機能が無さそうなので、他の人はどういう対応をしているのかな?と思って、先日オープンした Elastic 社の日本語フォーラムで質問してみた。
想像通りの方からの返答を頂いて分かったことは、やはり現行バージョンの Kibana4 にはその機能はないということ。ただし、Issue には上がっているとのこと。
この Issue には「4.2.0」や「roadmap 」のラベルが付いていたので、そのバージョンへ入れることを検討しているのではないかと思う。
現行バージョンは、4.0系で、次が4.1みたいなので、4.2はまだしばらく先になりそうな気配。
Kibana4 から Elasticsearch へ投げているクエリは、グラフの中のメニュー(▲をクリックすると出てくるメニュー)の「Request」タブで見ることができるのは知っていたので、これを使えばなんとかなるのでは!?と思って、超簡易 Web アプリを作った。
入力項目が2つあり、ひとつは Kibana4 で見つけたクエリ(JSON)を貼り付けるテキストエリア。もうひとつは、表形式で出力したいフィールドを入力するテキスト入力。
この入力値が POST されてきたら、Web アプリサーバから Elasticsearch へクエリを投げ、その結果を取得し、CSV ファイルとして出力するようにした。
最初は、Node.js の Express を使ってみようかなと思って、プロジェクト作成までは実行したんだけど、初めての Express と初めての Elasticsearch JavaScript API の組み合わせだと、時間ばかりかかってしまいそうな気配を感じたので、今回は諦めた(だって早く帰りたかったし)
結局、慣れている Symfony2 と、ちょっと慣れてきていた Elasticsearch PHP API を使って構築した。
「構築した」と言っても、実際に手を入れたのは View が一枚と Controller がひとつ。全てのロジックをひとつの Controller に埋め込むクソ仕様。エラーチェックも手抜きなので、正しい入力なら動くけど、間違った入力は Symfony2 の Exception がそのまま表示されるという developer friendly 仕様(だって早く帰りたかったし)。
「Request」タブで表示されるクエリは、「"size": 500」が指定されているので、そのままコピペした場合は最大500件が返ってくる。このくらいであれば全然問題ないのだが、この件数を増やすと、どこかの段階でメモリ不足を起こす。CSV の出力部分に関しては、Symfony2 の StreamedResponse を使ってみたけど、そもそも Elasticsearch API で返ってくる結果がごそっとメモリ(配列)に入ってしまうので、これだけではダメであった。
まぁ、いろいろとダメなところはあるけれど、今までできなかったことができるようになったので、まずはこれでヨシとする。0 から 1 あるいは 0 から 0.1 でもいいので、まずはゼロから脱却するのがいいのだ。そういう考えで最近は活動している(だって早く帰りたかったし)。