よしだのブログ

サブタイトルはありません。

Elasticsearch キックスタート!

f:id:yoshi0309:20140423001602p:plain

どうも!昨日、Elasticsearch*1の勉強会に行ったし、いい加減やり始めました。日本語破綻(笑)。

参考:勉強会メモ - 第4回elasticsearch勉強会 2014/04/21 - よしだのブログ

早速の感想から。Elasticsearch は全てのインターフェースをRESTで固めています。このため、HTTPメソッドを駆使しており、PUT とか DELETE とかを使います。かなり珍しいし、ブラウザから直接扱えないというデメリットもあるのですが、おかげでコマンドが非常に直感的でわかりやすくまとまっています。特に、ドキュメントの登録、更新、削除の容易さは素晴らしいですね。しかも、今日のエントリの範囲では、スキーマの定義は一切無し。なので、型の定義もなし。非常に簡単。更に驚いたことに、複数のスキーマ定義のドキュメントを同じインデックス中で扱うことが出来ます。FAST ESP で同じことをしようとすると、サービスやサーバーの構成まで組み直す必要があったのですがねぇ。すごいなぁ・・。

このレベルまで来ると、検索エンジンというよりは、もはや NoSQL の一種といったほうが適切なのでは無いかと思います。

さらに、複数起動するだけでクラスタを組めます。ポートの変更すら手でやる必要はありません。鼻血出るわ(笑)

以下、メモ書きです。簡単ですが、さっと凄さを体感できると思います。

環境

  • Elasticsearch 1.1.1
  • Oracle Java 1.7.0_51
  • Windows7 64bit

追記:本番での利用時には、JDK のバージョンには注意しましょう。

http://www.elasticsearch.org/blog/java-1-7u55-safe-use-elasticsearch-lucene/

インストール

zip をダウンロードしてきて、解凍します。その後、解凍したディレクトリの下にある ./bin/elasticsearch で起動します。

なお、サーバーで稼働さたい場合、servicewrapper が用意されているので、これを利用することだそうです。

https://github.com/elasticsearch/elasticsearch-servicewrapper

ステータスの確認

基本的に全てHTTPで行います。フォーマットは json です。デフォルトのポートは 9200 です。

  • 動いてるか確認する
http://localhost:9200/
  • クラスターのステータスをチェックする
http://localhost:9200/_cluster/health?pretty
  • サーバー上で稼働しているノードの一覧をみる
http://localhost:9200/_nodes?pretty
  • 同一クラスタの全てのノードを停止する(POSTで送信すること。)
http://localhost:9200/_cluster/nodes/_shutdown

設定ファイル

標準では、./config/elasticsearch.yml と ./config/logging.yml のみ。logging はその名の通りログの設定なので、実質1つだけです。ただし、コメント含め、380行とそこそこ長いですが。

最初に気にする必要がある設定は以下の2箇所のみです。

  • cluster.name : クラスタの名称(デフォルトは elasticsearch)
  • node.name : インスタンス名 (未定義も可。その場合、自動で名前を振られる)

同一のクラスター名のインスタンスがある場合、自動的にクラスタに参加します。elasticsearch のディレクトリを単純にコピーしてもう一つ起動し、その後、上記のクラスターのステータスをチェックするコマンドを投げると確認できます。素晴らしいことに、ポートの設定を変える必要すらありませんでした!*2

追記:コピー不要だそうです。すげー。。。

ドキュメントの登録、確認、更新、削除

以下のURLに、ドキュメント(jsonデータ)を PUT します。*3この場合、blog という名前のインデックスに、article というドキュメントの種別で、id が 1 のものを登録します。なお、id は省略可能で、省略するとesが自動で作成して登録します。

http://localhost:9200/blog/article/1
{
 "title":"new version of elasticsearch released !",
 "content":"hoge foo bar",
 "priority":10,
 "tags":["announce","elasticsearch","release"]
}

以下のコマンドで登録したドキュメントを確認できます。URLは登録と全く同じですが、メソッドは GET です。

http://localhost:9200/blog/article/1?pretty

また、登録のコマンドのドキュメントの値を変えて今度は POST すると、その値で上書き(更新)します。ただし、この方法では、ドキュメント全体を上書きするので、一部のフィールドの値を変更したい場合でも、全てのフィールドの値を POST する必要があります。

一部のフィールドの値のみを変更したい*4場合は、以下のコマンドを送信することで可能です。以下では、content というフィールドに new content という値を設定しています。メソッドは POST です。

http://localhost:9200/blog/article/1/_update
{
 "script":"ctx._source.content=\"new content\""
}

なお、送信したデータの値に含まれる script フィールドですが、値をスクリプトとして解釈し実行しています。その結果として値を入れているわけです。これを活用することで、元の値を使いつつ値を更新する(数値をインクリメントするなど)ことも可能です。

ドキュメントの削除は、以下のコマンドを送信します。メソッドは DELETE です。id を指定するだけで OK です。

http://localhost:9200/blog/article/1

NoSQL っぽいでしょ? 本番の検索はまた今度。

参考文献

以下の本の1章を参考に行いました!現行の最新版である、1.1.1 とは、1章の時点ですでに差異を見つけていますが、オンラインのドキュメントと突き合わせれば、特に問題は感じませんでした。内容も詳細まで踏み込んでいて、これ1冊でOKといえるのではと思います。

高速スケーラブル検索エンジン ElasticSearch Server

高速スケーラブル検索エンジン ElasticSearch Server

  • 作者: Rafal Kuc,Marek Rogozinski,株式会社リクルートテクノロジーズ,大岩達也,大谷純,兼山元太,水戸祐介,守谷純之介
  • 出版社/メーカー: KADOKAWA/アスキー・メディアワークス
  • 発売日: 2014/03/21
  • メディア: 大型本
  • この商品を含むブログ (1件) を見る

ちなみに、Kindle版もあります。同時発売なんて、なんとありがたい!

高速スケーラブル検索エンジン ElasticSearch Server (アスキー書籍)

高速スケーラブル検索エンジン ElasticSearch Server (アスキー書籍)

  • 作者: Rafal Kuc (lにストローク符号、cにアクサン・テギュ付く),Marek Rogozinski (nにアクサン・テギュ付く)
  • 出版社/メーカー: KADOKAWA / アスキー・メディアワークス
  • 発売日: 2014/03/25
  • メディア: Kindle版
  • この商品を含むブログ (2件) を見る

*1:sは小文字。

*2:自動で +1 インクリメントされたポートになります。なので、2つ目は 9201 になりました。

*3:ちなみに、書籍では PUT と書いてありますが、POSTでも可能でした。逆に id 自動生成をさせたい場合、PUTではエラーが返ります。おそらく、IDを指定し忘れて、間違えて自動生成させないための仕様だと思うので、登録はPUTと覚えるのが良いと思います。

*4:partial updateというやつですね