@johtaniの日記 2nd

@johtani ‘s blog 2nd edition

2014年のElasticsearch

早いもので、師走です。今年もあと少しとなりました。ということで、Advent Calendarの季節が始まりました。

この記事はElasticsearch Advent Calndar 2014の1日目のエントリです。

1日目ということで、簡単に今年の変遷を振り返りつつ、今年導入された新機能についてピックアップしてみようかと思います。

1.0リリース(Lucene 4.6.0)

今年一番の目玉と思いますが、1月にRCが公開されて、1.0.0が2月にリリースされました。 (ElasticSearch Serverの翻訳が昨年末に終わってレビューをしていた段階での発表だったので個人的にはきついタイミングでした) 1.0の主な変更点はこちら。

Elasticsearch(Sが小文字に)

1.0からSが小文字になりました。(#4634) 0.90以前のバージョンについては、Sが大文字になっています。 ややこしいですが、今年の3月に出版された黒いElasticSearch Server日本語版は原著が0.20で日本語版にするタイミングで0.90に対応しました。 このため、こちらの書籍のタイトルはSが大文字となっています。 (なお、原著の2nd Editionは小文字になっています)

Snapshot/Restoreの導入とGatewayの廃止

0.90以前のバージョンでは、gatewayというモジュールで、S3などにインデックスのメタデータなどを保存する機能がありました。 この機能は、0.20からlocal以外はdeprecatedとなりました。

インデックスのバックアップ、リストアのために、1.0で実装されたのがSnapshot/Restoreです。 Snapshot/Restoreでは、インデックスごと、もしくはクラスタ全体をリモートにあるリポジトリにスナップショットを取ることが可能となりました。 初期リリースの段階では、共有ファイルシステムのみでしたが、現在は、S3やHDFSなどに保存が可能となっています。

Aggregation

Facetをより強力にしたものです。Facetでは、指定したフィールドの集計のみでした。 データの解析などを行うには、独自で集計する必要がありました。 この機能をより柔軟に行えるように実装したのがAggregationです。

たとえば、アクセスログを日毎に集計し、さらに日毎の集計に対して国別の集計やユーザエージェントごとの集計をさらに行うといった感じです。 Facetの場合は、日毎の検索結果に対して個別に集計するのみでしたが、Aggregationを使うことで、1週間の検索結果に対して、 日毎に国別の集計を行うといったことが可能になっっています。

cat API

“=^.^=”猫が出てくるAPIです。(違う)

Elasticsearchでは、クラスタの状態などが全てREST APIで取得でき、JSONで結果が帰ってきていました。 JSONはプログラムなどで処理を行う場合は便利ですが、コンソールで確認したり、管理系のツールでメールで通知する場合などは見にくいことがあります。 これを解消したのが_cat APIです。(公式の紹介ブログはこちら

Circuit Breaker

OOMが発生しそうなfielddataの読み込みを検知して、事前に防ぐ機構になります。 初期段階ではFielddataに対してのものから実装されました。

1.1リリース(Lucene 4.6.1)

3月にリリースされました。Elasticsearchはまだまだ発展しているため、リリースのサイクルが短いのが特徴です。

1.x系では、Rolling Upgradeが導入されました。このため、クラスタ全体を停止することなく、クラスタのアップグレードが可能になりました。

search templates

検索クエリをテンプレートとして登録することができるsearch templatesです。 JSONでクエリを記述できるのは便利ですが、毎回組み立てるのは大変かもしれません。 特に、固定のクエリをプログラムから利用するような場合などです。 テンプレートとして登録しておくことで、検索時に値を埋め込むだけで検索ができるようになりました。

Aggregationの強化

Aggregationの種類が増えました。

  • cardinality:ユニークユーザ数の集計などが行えるaggregationです。HyperLogLog++アルゴリズムを利用した実装になっています。
  • significant_terms:単語の数による集計ではなく、コレクション全体に対する単語の頻度と、検索結果に対する単語の頻度を計算することで、重要度を計ることができます。
  • percentiles:パーセンタイル値を計算できます。

1.2リリース(Lucene 4.8系)

Java 7必須

利用しているLuceneがJava 7必須となったためです。また、Java 6のEOLも切れてますし。

dynamic scriptingがデフォルトオフ

採用していたMVELがサンドボックス化に対応していないため、危険を回避するためにオフとなりました。

インデキシングとマージング

インデキシングとマージ処理に関するさまざまな改善。

  • flushのthreasholdを操作回数ではなく、サイズや時間によるものに変更
  • デフォルトをConcurrentMergeSchedulerに変更

1.3リリース(Lucene 4.9.0系)

セキュリティ関連

  • JSONPのデフォルトオフ
  • MVELの非推奨化(1.4で削除)+script.disable_dynamicのデフォルト値がsandbox

aggregationの強化

  • top hits:Field Collapsing/combiningと呼ばれる機能です。たとえば、いくつかのサイトのHTMLを収集して検索機能を提供する場合に、ドメインごとに1件ずつ検索結果に出したい場合などに利用できる機能です。

その他にも以下のaggregationが追加されています。 * percentile ranks * geo bounds

mappingのtransform

Mappingにtransform機能が追加されました。 mappingにドキュメントの値を元に、インデキシング時に変換処理を記述できます。 たとえば、特定のフィールドにある値がある場合にだけ、あるフィールドに値を入れるなどといったことが可能になります。

ディスク関連

  • disk based shard allocation deciderが導入されました。ノードのディスクの使用率を元に、シャードを配置しても良いかといった決定を行う機構です。
  • チェックサムによるファイルのチェック(Lucene4.9で導入されたコードへの切り替え)

1.4リリース(Lucene 4.10系)

ベータ版が出されるほど、多くの改善が入っています。

resiliency

セキュリティ関連

  • CORSをデフォルト無効
  • Groovyがデフォルトのスクリプト言語に。

Aggregationの強化

以下のaggregationが追加されています。 * filterchildrenscripted_metric

Upgrade API

インデックスを最新のバージョンのものにアップグレードするためのAPIです。 Luceneは下位互換を保ってくれているため、古いバージョンのインデックスも読み込むことが可能です。 ただ、最新バージョンで使える機能が制限されていたりということもあります。 クラスタにあるインデックスをアップグレードするのにかかる時間や必要かどうかといったことを取得できる仕組みも提供します。

また、Lucene自体は、1つ前のメジャーバージョン(4.x系だと3.x系まで)までの互換性は提供していますが、 2つ前のメジャーバージョンの互換性がなくなります。 Luceneも5.x系のブランチが作成されており、5系のリリースにより、3系との互換性がなくなります。 5系のリリースに対応する場合にも、こちらのAPIが助けになるかと。

1.4.1

11/27に1.4.1がリリースされました。 シャードの配置やparent/child、nestedドキュメントの改善などが行われています。

まとめ

ということで、駆け足で、1月から11月までのElasticsearchの流れを追ってみました。 1.0で大きな機能追加、改善が行われ、その後も活発に開発が行われています。 要望などがあれば、MLで聞いてみたりやGitHubに登録するなどを行っていただければと。

あと、今年から来年にかけての大きなイベントとして、 Elasticsearch初のユーザカンファレンスのサイトがオープンしました。 Elasticsearchに関するいろいろな話が聞ける機会だと思うので、興味のある方は見ていただければと。

では、また次のAdvent Calendarで!(最終日の予定ですが、空きがあるのでなにか書くかも)

Comments