elasticsearchとSolrの比較 兼山 元太 @penguinana_ Sunday, December 16, 12
elasticsearchとSolrの比較兼山 元太
@penguinana_
Sunday, December 16, 12
自己紹介
• 兼山 元太 @penguinana_
• レシピ検索チーム @ http://cookpad.com/
• Solr4.0
Sunday, December 16, 12
Solrのバージョンアップを検討しているとき...
Sunday, December 16, 12
Elasticsearchも調べたほうがいいのでは?
Sunday, December 16, 12
• Luceneベース
• HTTP API
• 分散検索OK
• 日本語OK
Sunday, December 16, 12
• Luceneベース
• HTTP API
• 分散検索OK
• 日本語OK
既視感
Sunday, December 16, 12
http://solr-vs-elasticsearch.com/
Sunday, December 16, 12
感想• 機能面で不足はない
• APIが開発者にやさしい
• 容易に習得できる
• 大規模分散検索以外でも有用
• Solrを使ってなければこっちを本番に使いたい!
Sunday, December 16, 12
サンプルを使ってひと通り説明します
Sunday, December 16, 12
http://blog.livedoor.jp/techblog/archives/65836960.html
Sunday, December 16, 12
livedoorグルメ
• レストラン情報(21.4万店)
• 店名、扱っている料理、住所、緯度経度、アクセス数、最寄り柄行きからの距離、etc...
Sunday, December 16, 12
livedoorグルメ
• レビュー情報(20.5万レビュー)
• 総合評価(5段階)
• 雰囲気、値段、サービス、味
• レビューコメント
Sunday, December 16, 12
https://github.com/penguinco/ld_gourmet_search
Sunday, December 16, 12
Elasticsearchを使う• 1件登録して、1件検索
• 日本語の扱いを定義
• スキーマ定義
• 取り込み
• 検索
• スコアリングなどの調整
Sunday, December 16, 12
PUT
curl -XPUT http://localhost:9200/twitter/tweet/1 -d '{ "user": "kimchy", "post_date": "2012-11-26T20:12:00", "message": "Trying out elasticsearch", "score": 5}'
index type id
Sunday, December 16, 12
PUT
curl -XPUT http://localhost:9200/twitter/user/kimchy -d '{ "name" : "Shay Banon"}'
index type id
Sunday, December 16, 12
GET
curl -XGET http://localhost:9200/twitter/tweet/1{ "user": "kimchy", "post_date": "2012-11-26T20:12:00", "message": "Trying out elasticsearch", "score": 5}}
index type id
Sunday, December 16, 12
SEARCH
curl -XGET http://localhost:9200/twitter/tweet/_search -d '{ "query" : { "term" : { "user": "kimchy" } }}'
index type id
{ "user": "kimchy", "post_date": "2012-11-26T20:12:00", "message": "Trying out elasticsearch", "score": 5}
Sunday, December 16, 12
REST API
• ドキュメントの追加・削除
• 設定の追加・削除
• 全部HTTP APIでできる
• スキーマフリー
Sunday, December 16, 12
日本語$ curl -XGET 'localhost:9200/_analyze?pretty' -d '神泉' { "tokens" : [ { "token" : "神",
"start_offset" : 0, "end_offset" : 1, "type" : "<IDEOGRAPHIC>", "position" : 1 }, { "token" : "泉",
"start_offset" : 1, "end_offset" : 2, "type" : "<IDEOGRAPHIC>", "position" : 2 } ]}
Sunday, December 16, 12
日本語
Analyzerを変更することで対応
kuromojiが使えます!
http://www.hirotakaster.com/archives/2012/11/elasticsearch-kuromoji-plugin.php
Sunday, December 16, 12
kuromoji$ cd elasticsearch
$ bin/plugin -install elasticsearch/elasticsearch-analysis-kuromoji/1.0.0
$ git clone git://github.com/elasticsearch/elasticsearch-analysis-kuromoji.git
$ cd elasticsearch-analysis-kuromoji/
$ mvn clean package
$ cp target/elasticsearch-analysis-kuromoji-1.2.0-SNAPSHOT.jar ../plugins/analysis-kuromoji/elasticsearch-analysis-kuromoji-1.0.0.jar
# restart elasticsearch
Sunday, December 16, 12
add analyzer$ curl -XPUT 'localhost:9200/test/' -d '{ "index":{ "analysis":{ "tokenizer" : { "kuromoji" : { "type":"kuromoji_tokenizer", "mode":"search" } }, "analyzer" : { "kuromoji_analyzer" : { "type" : "custom", "tokenizer" : "kuromoji_tokenizer" } } } }}‘
Sunday, December 16, 12
kuromoji$ curl -XGET 'localhost:9200/test/_analyze?analyzer=kuromoji_analyzer&pretty' -d '神泉'
{ "tokens" : [ { "token" : "神泉",
"start_offset" : 0, "end_offset" : 2, "type" : "word", "position" : 1 } ]}
Sunday, December 16, 12
_analyze$ curl -XGET 'localhost:9200/test/_analyze?analyzer=kuromoji_analyzer&pretty' -d '関西国際空港'
{ "tokens" : [ {"token" : "関西",},
{"token" : "関西国際空港",},
{"token" : "国際",},
{"token" : "空港",}
]}
Sunday, December 16, 12
kuromojiをデフォルトに
• defaultっていう名前でanalyzerを宣言
Sunday, December 16, 12
同義語
• Solr同様同義語がファイルで書ける
• +WordNet形式も使える
Sunday, December 16, 12
analyzer
Sunday, December 16, 12
日本語の心配はある程度片付いた!
Sunday, December 16, 12
スキーマ定義
• スキーマフリー!
• JSONの型が採用される
• 強制的に定義もできる(mapping)
Sunday, December 16, 12
mapping例$ curl -XPUT 'http://localhost:9200/twitter/tweet/_mapping' -d '{ "tweet" : { "properties" : { "message" : {"type" : "string", "store" : "yes"} } }}'
Sunday, December 16, 12
Solrとの差分
• SolrのDynamicFieldよりも簡単
• type
• 1コア内に複数種類のdocを入れることを想定してあって便利
Sunday, December 16, 12
import(ruby)ratings = []CSV.foreach("ratings.csv") do |row| ratings << { :id => row[:id].to_i, :restaurant_id => row[:restaurant_id].to_i, :body => row[:body], :type => 'rating' } end
Tire.index 'livedoor_gourmet' do import ratings end
Sunday, December 16, 12
検索curl -X GET 'http://localhost:9200/livedoor_gourmet/restaurant/_search?pretty' -d '{ "query":{ "query_string":{ "query":"ラーメン"
} }, "sort":[{"access_count":"desc"}], "filter":{ "term":{"closed":"0"} }}'
Sunday, December 16, 12
Solrとの差分
• DSLが結構違う
• filter, facet, grouping, highlightもサポート
• スコアリングはスクリプト言語で定義できる
Sunday, December 16, 12
スコアリング
• PV順で並べたらうまくいったw
• 現実の問題も結構こういうこと多い
Sunday, December 16, 12
スコアリング
• 興味のある方はぜひ
• スクリプト言語で定義できる
• google: elasticsearch guide scoring
Sunday, December 16, 12
感想
• 機能面で不足はない
• APIが開発者にやさしい
• 容易に習得できる
• 大規模分散検索以外でも有用
Sunday, December 16, 12
API
Sunday, December 16, 12
config
curlだけでできる→アプリケーションに定義を置ける
Sunday, December 16, 12
コア追加
curlだけでできる→開発者ひとりで完結できる
Sunday, December 16, 12
容易に習得できる
• ほとんどの操作はcurlで完結
• Solrと共通の知識も多い
• luceneのクエリが使える
• qury DSLはちょっと障壁…
Sunday, December 16, 12
分散検索
Sunday, December 16, 12
分散検索
• number_of_shards
• number_of_replicas
• replication
• async/sync
• write consistency(one, quorum, all)
Sunday, December 16, 12
multi-tenant
• open/close index
• write I/O throttling
• merge policy control
• shard allocation
• number_of_replicas per index
Sunday, December 16, 12
plugin
Sunday, December 16, 12
plugin
$ bin/plugin -install Aconex/elasticsearch-head
Sunday, December 16, 12
パフォーマンス• 事例は多く見つかる
• foursquare, soundcloud, bugsense ...etc
• クエリキャッシュがない
• nginx, varnishなどでキャッシュする
Sunday, December 16, 12
まとめ
• 分散検索を使うならelasticsearch
• 分散検索を使わなくても利点が多い
• 今後使われる機会があるかも
Sunday, December 16, 12
see also...
• http://www.elasticsearch.org/
• http://www.elasticsearch.org/guide/
• http://solr-vs-elasticsearch.com/
• github.com/elasticsearch
• http://blog.sematext.com/
• #elasticsearch
Sunday, December 16, 12