Top Banner
elasticsearchSolrの比較 兼山 元太 @penguinana_ Sunday, December 16, 12
50

SolrとElasticsearchの比較

Jan 15, 2015

Download

Technology

genta kaneyama

Solr勉強会でelasticsearchの話をした時のコピーです
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: SolrとElasticsearchの比較

elasticsearchとSolrの比較兼山 元太

@penguinana_

Sunday, December 16, 12

Page 2: SolrとElasticsearchの比較

自己紹介

• 兼山 元太 @penguinana_

• レシピ検索チーム @ http://cookpad.com/

• Solr4.0

Sunday, December 16, 12

Page 3: SolrとElasticsearchの比較

Solrのバージョンアップを検討しているとき...

Sunday, December 16, 12

Page 4: SolrとElasticsearchの比較

Elasticsearchも調べたほうがいいのでは?

Sunday, December 16, 12

Page 5: SolrとElasticsearchの比較

• Luceneベース

• HTTP API

• 分散検索OK

• 日本語OK

Sunday, December 16, 12

Page 6: SolrとElasticsearchの比較

• Luceneベース

• HTTP API

• 分散検索OK

• 日本語OK

既視感

Sunday, December 16, 12

Page 7: SolrとElasticsearchの比較

http://solr-vs-elasticsearch.com/

Sunday, December 16, 12

Page 8: SolrとElasticsearchの比較

感想• 機能面で不足はない

• APIが開発者にやさしい

• 容易に習得できる

• 大規模分散検索以外でも有用

• Solrを使ってなければこっちを本番に使いたい!

Sunday, December 16, 12

Page 9: SolrとElasticsearchの比較

サンプルを使ってひと通り説明します

Sunday, December 16, 12

Page 10: SolrとElasticsearchの比較

http://blog.livedoor.jp/techblog/archives/65836960.html

Sunday, December 16, 12

Page 11: SolrとElasticsearchの比較

livedoorグルメ

• レストラン情報(21.4万店)

• 店名、扱っている料理、住所、緯度経度、アクセス数、最寄り柄行きからの距離、etc...

Sunday, December 16, 12

Page 12: SolrとElasticsearchの比較

livedoorグルメ

• レビュー情報(20.5万レビュー)

• 総合評価(5段階)

• 雰囲気、値段、サービス、味

• レビューコメント

Sunday, December 16, 12

Page 13: SolrとElasticsearchの比較

https://github.com/penguinco/ld_gourmet_search

Sunday, December 16, 12

Page 14: SolrとElasticsearchの比較

Elasticsearchを使う• 1件登録して、1件検索

• 日本語の扱いを定義

• スキーマ定義

• 取り込み

• 検索

• スコアリングなどの調整

Sunday, December 16, 12

Page 15: SolrとElasticsearchの比較

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

Page 16: SolrとElasticsearchの比較

PUT

curl -XPUT http://localhost:9200/twitter/user/kimchy -d '{ "name" : "Shay Banon"}'

index type id

Sunday, December 16, 12

Page 17: SolrとElasticsearchの比較

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

Page 18: SolrとElasticsearchの比較

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

Page 19: SolrとElasticsearchの比較

REST API

• ドキュメントの追加・削除

• 設定の追加・削除

• 全部HTTP APIでできる

• スキーマフリー

Sunday, December 16, 12

Page 20: SolrとElasticsearchの比較

日本語$ 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

Page 22: SolrとElasticsearchの比較

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

Page 23: SolrとElasticsearchの比較

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

Page 24: SolrとElasticsearchの比較

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

Page 25: SolrとElasticsearchの比較

_analyze$ curl -XGET 'localhost:9200/test/_analyze?analyzer=kuromoji_analyzer&pretty' -d '関西国際空港'

{ "tokens" : [ {"token" : "関西",},

{"token" : "関西国際空港",},

{"token" : "国際",},

{"token" : "空港",}

]}

Sunday, December 16, 12

Page 26: SolrとElasticsearchの比較

kuromojiをデフォルトに

• defaultっていう名前でanalyzerを宣言

Sunday, December 16, 12

Page 27: SolrとElasticsearchの比較

同義語

• Solr同様同義語がファイルで書ける

• +WordNet形式も使える

Sunday, December 16, 12

Page 28: SolrとElasticsearchの比較

analyzer

Sunday, December 16, 12

Page 29: SolrとElasticsearchの比較

日本語の心配はある程度片付いた!

Sunday, December 16, 12

Page 30: SolrとElasticsearchの比較

スキーマ定義

• スキーマフリー!

• JSONの型が採用される

• 強制的に定義もできる(mapping)

Sunday, December 16, 12

Page 31: SolrとElasticsearchの比較

mapping例$ curl -XPUT 'http://localhost:9200/twitter/tweet/_mapping' -d '{ "tweet" : { "properties" : { "message" : {"type" : "string", "store" : "yes"} } }}'

Sunday, December 16, 12

Page 32: SolrとElasticsearchの比較

Solrとの差分

• SolrのDynamicFieldよりも簡単

• type

• 1コア内に複数種類のdocを入れることを想定してあって便利

Sunday, December 16, 12

Page 33: SolrとElasticsearchの比較

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

Page 34: SolrとElasticsearchの比較

検索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

Page 35: SolrとElasticsearchの比較

Solrとの差分

• DSLが結構違う

• filter, facet, grouping, highlightもサポート

• スコアリングはスクリプト言語で定義できる

Sunday, December 16, 12

Page 36: SolrとElasticsearchの比較

スコアリング

• PV順で並べたらうまくいったw

• 現実の問題も結構こういうこと多い

Sunday, December 16, 12

Page 37: SolrとElasticsearchの比較

スコアリング

• 興味のある方はぜひ

• スクリプト言語で定義できる

• google: elasticsearch guide scoring

Sunday, December 16, 12

Page 38: SolrとElasticsearchの比較

感想

• 機能面で不足はない

• APIが開発者にやさしい

• 容易に習得できる

• 大規模分散検索以外でも有用

Sunday, December 16, 12

Page 39: SolrとElasticsearchの比較

API

Sunday, December 16, 12

Page 40: SolrとElasticsearchの比較

config

curlだけでできる→アプリケーションに定義を置ける

Sunday, December 16, 12

Page 41: SolrとElasticsearchの比較

コア追加

curlだけでできる→開発者ひとりで完結できる

Sunday, December 16, 12

Page 42: SolrとElasticsearchの比較

容易に習得できる

• ほとんどの操作はcurlで完結

• Solrと共通の知識も多い

• luceneのクエリが使える

• qury DSLはちょっと障壁…

Sunday, December 16, 12

Page 43: SolrとElasticsearchの比較

分散検索

Sunday, December 16, 12

Page 44: SolrとElasticsearchの比較

分散検索

• number_of_shards

• number_of_replicas

• replication

• async/sync

• write consistency(one, quorum, all)

Sunday, December 16, 12

Page 45: SolrとElasticsearchの比較

multi-tenant

• open/close index

• write I/O throttling

• merge policy control

• shard allocation

• number_of_replicas per index

Sunday, December 16, 12

Page 46: SolrとElasticsearchの比較

plugin

Sunday, December 16, 12

Page 47: SolrとElasticsearchの比較

plugin

$ bin/plugin -install Aconex/elasticsearch-head

Sunday, December 16, 12

Page 48: SolrとElasticsearchの比較

パフォーマンス• 事例は多く見つかる

• foursquare, soundcloud, bugsense ...etc

• クエリキャッシュがない

• nginx, varnishなどでキャッシュする

Sunday, December 16, 12

Page 49: SolrとElasticsearchの比較

まとめ

• 分散検索を使うならelasticsearch

• 分散検索を使わなくても利点が多い

• 今後使われる機会があるかも

Sunday, December 16, 12

Page 50: SolrとElasticsearchの比較

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