未分類

最新のElasticsearchを動かしてみる。触りだけ #elasticsearchjp

実は検索エンジンの会社で働いていたことがあります。
ぶっちゃけ検索エンジンのテクノロジーの奥深くについてドップリ詳しいわけではありませんが、昨今のシステム開発に置いて検索技術の重要性は重々承知していいます。

自分の会社では今はカッコイイことをしておらず、永続ストアはGoogle Docs、Excel(!!!)、H2データベースにあり検索エンジンは導入できていません。

日々あらゆるデータソースを探し回っている残念な状態です。

当然ながらこれから検索エンジンを導入するならばElasticsearchを使うのが自然な流れだよね、と思いつつ手を動かせていなかったので背水の陣でElasticsearch Advent Calendar 2014にエントリした次第です。

前置きが長くなりますがもう少し前置きがあります。今弊社には実はElasticsearchの社員がおり、毎日左隣でElasticsearch、kibana、logstashをいじっているのを目にしています。楽しそうです。

自分のElasticsearchの経験は、一度Elasticsearchの勉強会中に内職してTwitterのsampleストリーム(全ツイートの1%程度を受け取れる)をフィードするのを作った程度。フィードするだけで検索できていません!

これも一年前の話なので、最新版ではだいぶ変わっているかな?ということで触ってみました。

しかし時間があまりない!
とりあえずドキュメントをフィードして簡単に検索するのをREST APIを使ってやってみます!

1. Elasticsearchの起動
elasticsearch.orgよりダウンロード。展開してbinディレクトリのelasticsearchコマンドを叩くだけ。
推奨JVMは知らないけどJava1.8.0_25ですんなり起動しました。
9200番がREST APIの口になるみたいです。

2. ドキュメントのフィード
ツイートのデータっぽいのをcurlコマンドで3件だけフィードします。スキーマレスなので事前にスキーマの定義なし。いきなりJSONを突っ込めばOK。

23:52 ~ $ curl -XPUT 'http://localhost:9200/tweets/tweet/1' -d '{
> “text”: “this is a tweet”,
> “screen_name”: “yusuke”,
> “tweet_id”: “1”
> }'
{“_index”:”tweets”,”_type”:”tweet”,”_id”:”1″,”_version”:4,”created”:false}
23:52 ~ $
23:52 ~ $ curl -XPUT 'http://localhost:9200/tweets/tweet/2' -d '{
> “text”: “this is also tweet”,
> “screen_name”: “johtani”,
> “tweet_id”: “2”
> }'
{“_index”:”tweets”,”_type”:”tweet”,”_id”:”2″,”_version”:3,”created”:false}
23:52 ~ $
23:52 ~ $ curl -XPUT 'http://localhost:9200/tweets/tweet/3' -d '{
> “text”: “yet another つぶやき”,
> “screen_name”: “mike_neck”,
> “tweet_id”: “3”
> }'
{“_index”:”tweets”,”_type”:”tweet”,”_id”:”3″,”_version”:3,”created”:false}

これで3件のツイートが入りました。

3. 検索
同じくcurlコマンドで検索します。

23:53 ~ $ curl -XGET http://localhost:9200/tweets/tweet/_search -d'
> {
> “query”:
> {
> “match”:{“screen_name”:”yusuke”}
> }
> }'
{“took”:2,”timed_out”:false,”_shards”:{“total”:5,”successful”:5,”failed”:0},”hits”:{“total”:1,”max_score”:0.30685282,”hits”:[{“_index”:”tweets”,”_type”:”tweet”,”_id”:”1″,”_score”:0.30685282,”_source”:{
“text”: “this is a tweet”,
“screen_name”: “yusuke”,
“tweet_id”: “1”
}}]}}

screen_nameがyusukeのツイートだけを検索できましたね!
ぶっちゃけJava APIを使ったときより直感的に扱えました。最新版のJava APIは見ていないのでわかりませんが、わかりやすくなってるといいなー。
これからもっと触ってみます!