2015年10月28日 エンジニアリング

Senseの歴史 - Sense 2.0.0-beta1の紹介(日本語訳)

By Boaz Leskes

誕生

よくある良いプロジェクト同様、Senseもビールを飲みながら考えつきました。 Amstelでの手漕ぎボートのセッションの後で。 友人の Jasperと私はJasperの会社で毎年行われる ハッカソンについて話をしていました。 このハッカソンはどのようなアイデアでどんなチームで行うかを聞き取りされる、厳密なハッカソンです。 その時、私とJasperはChromeブラウザに別のヒストリーを表示するという作業をやると Anne Velingに話をしていました。

Jasperと私はElasticsearchのユーザでしたが、リッチなREST APIにリクエストを送信するための 便利なツールがないと知っていました。 恥ずべきことに、cURLコマンドを利用するターミナルがその時の一番良いツールでした。 皆さん、ターミナルでボディつきのリクエストをサブミットするのがどのくらい不便かというのをわかるために、 5秒ほどターミナルで実行してみてください。 タイプミスのような単純なことでさえ、すべてのコマンドを再タイプしなければならなかったり、 複数行サポートのターミナルと戦ったりです。 ウェブベースのJSONエディタを見つけ出して、それをベースにすることが必要でした。

終わりなきウィークエンド

リサーチをして、Anneに電話しました。 私は彼に、History Pageのプロジェクトにもコミットするが、 Elasticsearchユーザなので、便利なコンソールを開発する時間も欲しいという話をしました。 私たちは、 Aceオンラインエディタを利用して、 自動でAPIを認識するナレッジベースを構築し、 コンテキストに沿ったサジェストを大なうようにしました。 Anneはすぐに、それが素晴らしいと同意してくれました。 しかし、彼は、ハッカソンの基本的なルール(週末にそれが終わる必要がある)に違反しているので、 そのアイデアを却下するしかありませんでした。 確かに、私たちが提案していたものは行えませんでした。 最後に、私たちは、ChromeのHistory Pageの素晴らしい置き換えについて実装しました。

それでも、私はチャレンジし、それが終わるであろうことを終わるであろうことを証明しなければなりませんでした。 次の週末(といくつかの終業後 :))に、私はそれを作りました。 Senseの誕生です。 それは、まだバグだらけでしたが、動きました。 これを見せるとみんな興奮しました。

初期

Knowledge Baseの拡張とバグのフィックスで数日を過ごしました。 Senseは広まり始め、ずっと古いバグのあるバージョンを利用しないといけないのかと私は恐れました。 SenseをChromeのExtentionとしてリリースすることを決め、リリースすると自動的に更新されるようにしました。 History Panelのような機能を一つづつ追加するようにしました。

Elasticにジョインしてから、会社の人たちがSenseを使用しているということを聞き、とても幸せでした。 特に、 Clintと話をしたときのことを覚えています。 彼は、”You know what Sense should do? It should use this format and allow you to have multiple requests in the editor” 「Senseになにをすべきかわかる?フォーマットを使うべきだし、エディタで複数のリクエストを持つようにするべきだ」 と言いました。 もちろん、その他のチャレンジも行いました。これは、簡単なものではなく、Aceの詳細を知る必要がありました。 それは新しいAceモード(Aceによって利用されているハイライティングロジック)です。 これは、Senseのサジェストエンジンに密に統合されました。

次のものが古いSenseのスクリーンショットです。

Figure 1. Sense 0.7

Sense 0.7

APIのURLを入力すると、JSONのボディが入力されます。 うまく切り離すことができ、AceのスタンダードJSONモードを使っていました。 しかし、ここで、次のようなフォーマットをどうやってサポートするか考える必要がありました。

GET _cluster/health
POST index/_settings
{
  "index": { "number_of_replicas": 3 }
}
		

これは、Aceが3つの異なるものをどうやってパースするかを知る必要があるということです。 HTTPメソッドとURLとJSONボディです。 また、困ったことに、前に説明した前に説明した通り、明らかに別々にはならないものでした。 JSONボディが完全であることを知る唯一の方法はかっこを数えることです。 それは、いくつかの作業とAceのカスタマイズが必要でしたが、それらを切り離すことができました。 そして、Senseのシンタックスが生まれたのです(Thanks Clint!)

Marvel時代

就業時間中、私の優先すべき仕事はMarvelの開発になりました。 これは、Elasticsearchのための管理と監視のためのソリューションです。 (side note: Marvelは生まれ変わっています。(” Shield, Watcher, and Marvel 2.0.0 GA Released“)) Marvelは開発環境ではフリーなので、MarvelにSenseを組み込むことにしました。 これにより、Senseの開発が日中も行えるようになり、多くのユーザに利用され始めました。 また、Senseは実際に真の JavaScript開発者によって開発されました。 彼は、コードをクリーンにし、ブラウザにおける最新の技術を私に教えてくれました。

この期間のSenseは数回書き換えられています。 最も顕著なものは、個別のURLとJSONのサジェストエンジンを書き換えて、 1つのサジェストエンジンにしこれらのコンテキストで動作するようにし、さらに3つ目のコンテキスト(URLパラメータ)を追加したことです。

新しいエンジンはまた、複数のサジェストコンテキストをメンテナンスするのが簡単になりました。 例えば、 _search APIのソートパラメータを考えます。

GET _search
{
  "sort": [
     "timestamp": "desc",
     "price": {
        "order": "desc".
        "missing": "last"
     },
     "nested_filter": { "term": { ... }},
     "_score"
  ]
}
		

ユーザがどこにいるかによって、Senseは単純な値(_scoreのような)か、 複雑な構造( ordermissingのような)やフィルタ(nested_filterのような)も サジェストする必要があります。 これらのサジェストのパスが一度に処理され、無関係なものは除外されます。

Sense 2.0の紹介!

Marvel 1.xはKibana 3.0をベースにしていました。 これは、データの探索やダッシュボードツールとして素晴らしいものでした。 しかし、Kibanaチームはさらに素晴らしいものを出しました。 Kibana 4.xはElasticsearchをバックエンドとするUIアプリを簡単に構築することができる プラットフォームとして設計されています。 実際に、 Marvel 2.0はKibanaの プラットフォームで利用できる最初のアプリです。

Senseの話に戻します。 ElasticsearchのAPIとやりとりする一般的なコンソールです。 これをKibanaのアプリぴったりだと気付きました。 ということで、 Sense 2.0をKibanaアプリとしてオープンソースで公開しました。 開発及び本番環境で利用してください。

Figure 2. Screenshot Sense 2.0

Sense 2.0


リリースのハイライト

Sense 2.0の新しい機能をここで簡単に紹介します。 (すべての変更点については こちらをご覧ください。)

Elasticsearch 2.0
SenseのナレッジベースをElasticsearch 2.0サポートに更新しました。 新しいPipeline aggregationにも対応しています。
複数リクエストの実行

テストやいくつかの一連のコマンドを繰り返し実行したい時があるでしょう。 その時に、それら全てをSenseに記述し、 実行したいリクエストを選択状態にしてElasticsearchにリクエストできます。

Figure 3. Submit multiple requests

multiple requests

Senseは、Elasticsearchにリクエストを一つずつ送信し、それぞれの出力結果を右のパネルに表示します。 これは、問題のデバッグや複数のシナリオでのクエリの組み合わせの実行に非常に便利です。

複数リクエストのコピーペースト

複数リクストを選択し、フォーマットしたり、cURLのコマンドとしてコピーすることも可能です。

Figure 4. Copy multiple requests as cURL

copy as curl

# Delete all data in the `website` index
curl -XDELETE "http://localhost:9200/website"
# Create a document with ID 123
curl -XPUT "http://localhost:9200/website/blog/123" -d'
{
  "title": "My first blog entry",
  "text":  "Just trying this out...",
  "date":  "2014/01/01"
}'
				

>もちろん、複数のcURLコマンドをコピーしてSenseにペースとすると、Senseはそれらをパースしてくれます。


まとめ

Sense 2.0.0のベータリリースです。 実際に多くの作業が終わった認識です。すぐにGAが出るでしょう。

Sense 2.0を知り、試していただくために、新しいドキュメントを参考にしてください。 バグやリクエストがある場合は、 フォーラムGitHubのIssueに登録をお願いします。