mysqlユーザ視点での小さく始めるelasticsearch
DESCRIPTION
第3回Elasticsearch勉強会での発表資料ですTRANSCRIPT
![Page 1: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/1.jpg)
page
Feb, 201407th
MySQLユーザ視点での小さく始めるElasticsearchKentaro Yoshida in 第3回 Elasticsearch勉強会
1
![Page 2: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/2.jpg)
page
1. はじめに2. 自己紹介3. 今回のテーマ4. Yamabikoの紹介5. 検索ことはじめ6. Elasticsearch雑感7. まとめ
本日の流れ
2
![Page 3: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/3.jpg)
page
1. はじめに
3
![Page 4: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/4.jpg)
page
こんなお悩みを抱えていませんか?
4
![Page 5: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/5.jpg)
page
MySQLを利用している
5
![Page 6: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/6.jpg)
page
だけれども、
6
![Page 7: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/7.jpg)
page
検索漏れが少ない日本語全文検索 “Kuromoji”を使いたい!
7
Searchモード・Extendedモードが秀逸
![Page 8: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/8.jpg)
page
つまり
8
![Page 9: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/9.jpg)
page
“Solr” or “Elasticsearch” が必要
9
![Page 10: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/10.jpg)
page
APIをRESTfulに扱える “Elasticsearch” がアツい
10
![Page 11: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/11.jpg)
page
【課題】異種RDB間のデータ同期
11
![Page 12: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/12.jpg)
page
2. 自己紹介
12
![Page 13: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/13.jpg)
page
自己紹介
13
•よしけんさん• (株)リブセンス• Web系インフラの研究開発エンジニア
• Elasticsearch歴:2013年 初夏~
好きなプロダクト
![Page 14: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/14.jpg)
お知らせ
![Page 15: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/15.jpg)
![Page 16: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/16.jpg)
page
3.今回のテーマ
16
![Page 17: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/17.jpg)
page
今回のテーマ
17
実データを用いて手軽にElasticsearchと連携した検索を行いたいElasticsearchをスモールスタートで使い始めたい既存プログラムの更新系処理に触れずに小さく始めたい
メインRDBはMySQLではあるが、検索のみElasticsearchを使う構成Amazon RDS for MySQLにも応用できる手離れの良い構成にしたい
MySQLサーバの管理無しに冗長化構成を実現できる (Multi-AZ)
![Page 18: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/18.jpg)
page
MySQLのレコードをElasticsearchへ同期したい
18
![Page 19: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/19.jpg)
page
つまり異種RDB間のデータ同期
19
![Page 20: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/20.jpg)
page
既存製品はElasticsearch非対応Attunity Replicate / Tungsten Replicator
20
![Page 21: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/21.jpg)
page
そこに... Riverプラグインを発見
21
![Page 22: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/22.jpg)
page
elasticsearch-river-jdbc
22
概要ElasticsearchのRiverプラグインとして動作するJDBCドライバを指定することで各種RDBからレコードを流し込めるSQLを一定間隔で実行し、その結果を基に取り込みを行う実テーブルだけでなくVIEWテーブルからも取り込める
![Page 23: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/23.jpg)
page
elasticsearch-river-jdbc
23
不都合な点動作が安定せずElasticsearchサーバを再起動する必要があるしばらく動いていたがいつの間にか止まっている現象Elasticsearchサーバ側の役割が増え、単機能ではなくなる
同期する度にElasticsearch側のドキュメントが空になる挙動
![Page 24: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/24.jpg)
page
MySQL BinlogAPIが役立つのでは?
24
![Page 25: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/25.jpg)
page
試してみたものの・・・
25
![Page 26: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/26.jpg)
page
安定稼働への道が遠く、挫折...
26
![Page 27: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/27.jpg)
page
そこで!
27
![Page 28: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/28.jpg)
page
欲しいものが無いので作りました
28
![Page 29: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/29.jpg)
page
4. Yamabiko
29
![Page 30: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/30.jpg)
page
Yamabiko
30
https://github.com/y-ken/yamabiko
���������� ����� � ����������������� ����� � ����
����������
��� �������� ��
���� ������������������ ��
�������������
���� ������������������ ��
��������
����������� �������������������
������������ !"#$���������%&'(��")*
� �� ����������+,-./0�1�2345%6789:
�������������
���
���
������������
![Page 31: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/31.jpg)
page
Yamabiko
31
概要MySQLからElasticsearchへデータを非同期に逐次反映
Amazon RDS・MariaDB・PerconaServer等の互換DBにも対応
Elasticsearchとは別の単体ミドルウェアとして動作
CentOS 6.x向けのRPMパッケージとして配布中任意のSQL文の結果の差分から、insert/update/deleteイベントを検知
SELECT * FROM contents WHERE DATE_ADD(updated_at, INTERVAL 5 MINUTE) > NOW(); といったクエリで差分同期も可能
![Page 32: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/32.jpg)
page
Yamabiko
32
ユニークな特徴:delete検知が出来るPrimaryKeyのギャップ判定を行うことで実現行が物理削除されてしまうケースでも追従可能
数十万行単位でも動作します
なぜ更新ログ(BinaryLog)ではなくSQLの結果を同期するのか?JOIN無しで検索するnoSQL的概念に対応させるため非正規化VIEWテーブルを作ることを想定
![Page 33: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/33.jpg)
page
Yamabikoシステム構成例
33
mysql_replicator_multi を利用する場合Yamabikoが使うメタデータを格納するためのMySQLを指定同期情報管理テーブル更新/削除判定用のハッシュテーブル
同期する行数がさほど無ければデータ参照元に相乗りしても良い
INSERT/SELECT
全文検索
![Page 34: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/34.jpg)
page
5. 検索ことはじめ
34
![Page 35: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/35.jpg)
page
データ投入
35
かねてから無償配布されているライブドアグルメのCSVデータを利用MySQLをGUI管理できるMacアプリ”Sequel Pro"を用いてDBへ流し込むYamabikoを利用し、MySQLからデータの同期を始める登録クエリ:SELECT * FROM restaurants WHERE closed = 0;
次のトピックは後ほど解説mapping:緯度経度を扱えるgeo_point型を使うためanalyzer:高機能な全文検索を扱えるKuromojiを使うため
![Page 36: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/36.jpg)
page 36
![Page 37: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/37.jpg)
page
検索クエリ
37
curl -X POST 'http://localhost:9200/livedoor-gourmet/_search?pretty' -d '{ "query":{ "query_string":{ "query":"name:ワイン AND pref_id:13" } }, "sort" : [ { "access_count" : "desc" }, "fan_count", "_score" ], "from" : 0, "size" : 10}'
Luceneクエリで条件指定いわゆるWHERE句
並び替え条件を指定ORDER BY access_count DESC ...
範囲選択 LIMIT 0, 10
![Page 38: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/38.jpg)
page
意外と簡単!
38
![Page 39: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/39.jpg)
page
緯度経度検索
39
MySQLでのGeo検索はイケてないのですSPATIALインデックスを使えるのはMyISAMだけ最近はInnoDBでGeohashを用いればある程度のことは出来る
Geohashにも対応しているElasticsearchであれば、Z曲線のグループ毎にfacet検索できるので、地域毎に何件ヒットしたかの検索も(多分)可能MySQL側で緯度と経度が別カラムに格納されているテーブルをYamabikoを使ってElasticsearchに流し込む場合には、SELECT文に CONCAT(lat, ",", lon) AS location という列を追加し、次ページのmapping定義をすれば緯度経度や近傍検索が出来る
![Page 40: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/40.jpg)
page
緯度経度検索
40
# mapping定義を行った後にデータを流し込む$ curl -XPUT "http://localhost:9200/livedoor/restaurants/_mapping" -d '{ "restaurants" : { "properties" : { "location": { "type": "geo_point", "lat_lon": "true" } } }}'
![Page 41: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/41.jpg)
page
緯度経度検索
41
# 検索例 渋谷近辺で店名に「ワイン」を含むお店を10件リストアップします$ curl -XGET "http://localhost:9200/livedoor/restaurants/_search?pretty" -d '{ "query" : { "filtered" : { "query":{ "query_string":{ "query":"name:ワイン" } }, "filter" : { "geo_distance" : { "distance" : "1km", "location" : { "lat" : 35.3924, "lon" : 139.4157 } } } } }, "from" : 0, "size" : 10}'
![Page 42: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/42.jpg)
page
意外と簡単!
42
![Page 43: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/43.jpg)
page
Mapping
43
個別指定したい場合には全てのフィールドを定義しなくとも、個別指定したいカラムのみのmappingをPOSTすることでも動くindexやtypeの動的生成をする場合の注意フィールドの型を推論してくれるのは便利だが、意図せぬ挙動を防ぐためにも、実運用時はきちんと定義しておきたい初回に投入されたドキュメントの内容でカラムが決まるため
MySQLと違い、後でMappingの定義の変更は不可パフォーマンス的観点からも、not_analyzedも含めて指定すると良いデフォルトではString型の文字は全てngramで分解するため
![Page 44: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/44.jpg)
page
Analyzer
44
Kuromojiの利用方法環境:Elasticsearch 1.0.0 RC2 RPM注意点次のような手順でプラグインをインストール indexを作る前に登録する必要がある(既にある場合は作り直し)プラグインを入れた後はelasticsearchを再起動する
$ cd /usr/share/elasticsearch$ sudo ./bin/plugin --install \ elasticsearch/elasticsearch-analysis-kuromoji/2.0.0.RC1$ sudo /etc/init.d/elasticsearch restart
![Page 45: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/45.jpg)
page
Analyzer
45
$ curl -XPUT 'http://localhost:9200/livedoor/' -d'{ "index":{ "analysis":{ "tokenizer" : { "kuromoji" : { "type" : "kuromoji_tokenizer", "mode" : "extended" } }, "analyzer" : { "analyzer" : { "type" : "custom", "tokenizer" : "kuromoji" } } } }}'
![Page 46: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/46.jpg)
page
6. Elasticsearch雑感
46
![Page 47: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/47.jpg)
page
MySQL脳から見たElasticsearch
47
![Page 48: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/48.jpg)
page
Elasticsearch ステキな所
48
MySQL同様にRPMパッケージを利用して手軽に構築できるSolrと異なり、完全RestAPIで操作できるFacet検索は大変便利配列型はタグ検索にも大変便利Luceneクエリは学習コストが低く直感的複数カラムに渡る検索条件を指定しても速い
MySQLと異なり1テーブル1インデックスという制約が無いため複数のソートキーを重み付けしながら使える (boost)緯度経度周りの検索がMySQLのそれよりも高機能である
![Page 49: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/49.jpg)
page
Elasticsearch ハマり所
49
Query DSLは奥が深く実に複雑なため、未だに自在に操れません...mapping定義を更新するためには、index/typeごと消す必要があること列はinsertAPIやbulkAPIでは自動追加されないため、updateAPIを用いるnoSQL的な概念の理解
GROUP BYに相当する機能は無いGitHubの Field Collapsing/Combining · Issue #256 の今後に期待
MySQLでは正規化さえしておけばSQL言語で自在に扱えるが、JOINが出来ないElasticsearchでは厳しい。そのため、取り出したい形式に合わせた非正規化データ構造を入念に準備する必要があること
![Page 50: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/50.jpg)
page
Elasticsearch ハマり所
50
noSQL故にJOIN出来ないということは、結果として各typeに同じデータを複製された状態で持たせることになり、一貫性が失われるという懸念
mappingやデータ登録時の_parentや_childを使うと類似の事は可能ただし、1:Nとしての紐付け、つまりLEFT JOIN的な事は不可能こちらのページの「Parent & child」が分かりやすいのでオススメFun with elasticsearch's children and nested documents - Space Vaticanhttp://www.spacevatican.org/2012/6/3/fun-with-elasticsearch-s-children-and-nested-documents/
![Page 51: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/51.jpg)
page
7. まとめ
51
![Page 52: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/52.jpg)
page
まとめ
52
Elasticsearchの手軽さは革命的
ElasticsearchはKibanaの為だけのプロダクトではない
Yamabikoを使えば、並行運用しつつスモールスタートが可能
![Page 53: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/53.jpg)
お知らせ
![Page 54: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/54.jpg)
お知らせ
![Page 55: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/55.jpg)
![Page 56: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/56.jpg)
![Page 57: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/57.jpg)
![Page 58: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/58.jpg)
“Air Intern”にてオフィス動画を公開中 http://airintern.com/company/detail/livesense
“LIVESENSE made*”にてエンジニア求人掲載中
http://made.livesense.co.jp/
![Page 59: MySQLユーザ視点での小さく始めるElasticsearch](https://reader031.vdocuments.mx/reader031/viewer/2022020920/55518ee5b4c90596028b575a/html5/thumbnails/59.jpg)
page
Thanks!
59
ご清聴ありがとうございました。