View
8.388
Download
0
Category
Preview:
DESCRIPTION
第3回Elasticsearch勉強会での発表資料です
Citation preview
page
Feb, 201407th
MySQLユーザ視点での小さく始めるElasticsearchKentaro Yoshida in 第3回 Elasticsearch勉強会
1
page
1. はじめに2. 自己紹介3. 今回のテーマ4. Yamabikoの紹介5. 検索ことはじめ6. Elasticsearch雑感7. まとめ
本日の流れ
2
page
1. はじめに
3
page
こんなお悩みを抱えていませんか?
4
page
MySQLを利用している
5
page
だけれども、
6
page
検索漏れが少ない日本語全文検索 “Kuromoji”を使いたい!
7
Searchモード・Extendedモードが秀逸
page
つまり
8
page
“Solr” or “Elasticsearch” が必要
9
page
APIをRESTfulに扱える “Elasticsearch” がアツい
10
page
【課題】異種RDB間のデータ同期
11
page
2. 自己紹介
12
page
自己紹介
13
•よしけんさん• (株)リブセンス• Web系インフラの研究開発エンジニア
• Elasticsearch歴:2013年 初夏~
好きなプロダクト
お知らせ
page
3.今回のテーマ
16
page
今回のテーマ
17
実データを用いて手軽にElasticsearchと連携した検索を行いたいElasticsearchをスモールスタートで使い始めたい既存プログラムの更新系処理に触れずに小さく始めたい
メインRDBはMySQLではあるが、検索のみElasticsearchを使う構成Amazon RDS for MySQLにも応用できる手離れの良い構成にしたい
MySQLサーバの管理無しに冗長化構成を実現できる (Multi-AZ)
page
MySQLのレコードをElasticsearchへ同期したい
18
page
つまり異種RDB間のデータ同期
19
page
既存製品はElasticsearch非対応Attunity Replicate / Tungsten Replicator
20
page
そこに... Riverプラグインを発見
21
page
elasticsearch-river-jdbc
22
概要ElasticsearchのRiverプラグインとして動作するJDBCドライバを指定することで各種RDBからレコードを流し込めるSQLを一定間隔で実行し、その結果を基に取り込みを行う実テーブルだけでなくVIEWテーブルからも取り込める
page
elasticsearch-river-jdbc
23
不都合な点動作が安定せずElasticsearchサーバを再起動する必要があるしばらく動いていたがいつの間にか止まっている現象Elasticsearchサーバ側の役割が増え、単機能ではなくなる
同期する度にElasticsearch側のドキュメントが空になる挙動
page
MySQL BinlogAPIが役立つのでは?
24
page
試してみたものの・・・
25
page
安定稼働への道が遠く、挫折...
26
page
そこで!
27
page
欲しいものが無いので作りました
28
page
4. Yamabiko
29
page
Yamabiko
30
https://github.com/y-ken/yamabiko
���������� ����� � ����������������� ����� � ����
����������
��� �������� ��
���� ������������������ ��
�������������
���� ������������������ ��
��������
����������� �������������������
������������ !"#$���������%&'(��")*
� �� ����������+,-./0�1�2345%6789:
�������������
���
���
������������
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
Yamabiko
32
ユニークな特徴:delete検知が出来るPrimaryKeyのギャップ判定を行うことで実現行が物理削除されてしまうケースでも追従可能
数十万行単位でも動作します
なぜ更新ログ(BinaryLog)ではなくSQLの結果を同期するのか?JOIN無しで検索するnoSQL的概念に対応させるため非正規化VIEWテーブルを作ることを想定
page
Yamabikoシステム構成例
33
mysql_replicator_multi を利用する場合Yamabikoが使うメタデータを格納するためのMySQLを指定同期情報管理テーブル更新/削除判定用のハッシュテーブル
同期する行数がさほど無ければデータ参照元に相乗りしても良い
INSERT/SELECT
全文検索
page
5. 検索ことはじめ
34
page
データ投入
35
かねてから無償配布されているライブドアグルメのCSVデータを利用MySQLをGUI管理できるMacアプリ”Sequel Pro"を用いてDBへ流し込むYamabikoを利用し、MySQLからデータの同期を始める登録クエリ:SELECT * FROM restaurants WHERE closed = 0;
次のトピックは後ほど解説mapping:緯度経度を扱えるgeo_point型を使うためanalyzer:高機能な全文検索を扱えるKuromojiを使うため
page 36
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
page
緯度経度検索
39
MySQLでのGeo検索はイケてないのですSPATIALインデックスを使えるのはMyISAMだけ最近はInnoDBでGeohashを用いればある程度のことは出来る
Geohashにも対応しているElasticsearchであれば、Z曲線のグループ毎にfacet検索できるので、地域毎に何件ヒットしたかの検索も(多分)可能MySQL側で緯度と経度が別カラムに格納されているテーブルをYamabikoを使ってElasticsearchに流し込む場合には、SELECT文に CONCAT(lat, ",", lon) AS location という列を追加し、次ページのmapping定義をすれば緯度経度や近傍検索が出来る
page
緯度経度検索
40
# mapping定義を行った後にデータを流し込む$ curl -XPUT "http://localhost:9200/livedoor/restaurants/_mapping" -d '{ "restaurants" : { "properties" : { "location": { "type": "geo_point", "lat_lon": "true" } } }}'
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
page
Mapping
43
個別指定したい場合には全てのフィールドを定義しなくとも、個別指定したいカラムのみのmappingをPOSTすることでも動くindexやtypeの動的生成をする場合の注意フィールドの型を推論してくれるのは便利だが、意図せぬ挙動を防ぐためにも、実運用時はきちんと定義しておきたい初回に投入されたドキュメントの内容でカラムが決まるため
MySQLと違い、後でMappingの定義の変更は不可パフォーマンス的観点からも、not_analyzedも含めて指定すると良いデフォルトではString型の文字は全てngramで分解するため
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
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
6. Elasticsearch雑感
46
page
MySQL脳から見たElasticsearch
47
page
Elasticsearch ステキな所
48
MySQL同様にRPMパッケージを利用して手軽に構築できるSolrと異なり、完全RestAPIで操作できるFacet検索は大変便利配列型はタグ検索にも大変便利Luceneクエリは学習コストが低く直感的複数カラムに渡る検索条件を指定しても速い
MySQLと異なり1テーブル1インデックスという制約が無いため複数のソートキーを重み付けしながら使える (boost)緯度経度周りの検索がMySQLのそれよりも高機能である
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
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
7. まとめ
51
page
まとめ
52
Elasticsearchの手軽さは革命的
ElasticsearchはKibanaの為だけのプロダクトではない
Yamabikoを使えば、並行運用しつつスモールスタートが可能
お知らせ
お知らせ
“Air Intern”にてオフィス動画を公開中 http://airintern.com/company/detail/livesense
“LIVESENSE made*”にてエンジニア求人掲載中
http://made.livesense.co.jp/
page
Thanks!
59
ご清聴ありがとうございました。
Recommended