Yokozuna日本語検索機能を 評価しました
Takashi Sogabe(@rev4t)
Yoshihisa Tanaka (@yosisa)
Internet Initiative Japan., Inc.
質問
• Riakに入れたデータ、どのように取り出していますか?
– Key を直接指定
– Secondary Index
– Map/Reduce
– Riak Search
– Mohair
検索機能はとても便利
• Gmail
• Evernote
膨大な量のデータが入っていても、
すぐに検索結果が返ってくる!
しかし検索機能は実装が大変..
• 膨大な構造化がされていないデータ
–チャット
–日記
– etc.
全文検索エンジンの運用
• Namazu, Senna, Hyper Estrayer, Lucene/Solr, etc...
–オリジナルデータの保管方法
– リアルタイムにインデックス作っても大丈夫?
–スケールアウト簡単にできる?
Yokozuna
• https://github.com/basho/yokozuna
• Yokozuna = Riak + Solr
– Riak と Solr の良いところ取り
– Riakの運用+αで全文検索ができるようになる
–色々考えなくても簡単にスケールアウトする
– Solrと同じQueryが使える
Riak Searchとの違い
• Riak Search
–多言語への対応が弱い
• 日本語の形態素解析
– Solrの方が検索機能が充実している
• スコアリング、ファセット検索、検索結果のハイライト, etc.
ソフトウェア構成
Node A
Node B
Node C
Node D
Solr A
Solr B
Solr C
Solr D
Bucket X
Bucket X
Bucket X
Bucket X
• 各Node(ホスト)毎に Solrが動作している
• Objectをstoreする際に、各Node上のSolrにindexが作成される
• Search時は自動的に Distributed Searchが実行される
Store: Riak API Search: Solr API
YOKOZUNA 使い方
インストール手順(0)
• Yokozuna ソースコード – https://github.com/basho/yokozuna/blob/master/doc
s/INSTALL.md
– yokozuna-0.7 が最新版
• 必要なもの – Erlang R15B02 or higher
– JRE 1.6 or later (jarコマンドが必要)
– GNU make
– GCC(C/C++)
インストール手順(1)
$ wget http://data.riakcs.net:8080/yokozuna/riak-yokozuna-0.7.0-src.tar.gz
$ tar zxvf riak-yokozuna-0.7.0-src.tar.gz
$ cd riak-yokozuna-0.7.0-src
$ make rel
$ sed -e '/{yokozuna,/,/]}/{s/{enabled, false}/{enabled, true}/;}' -i.back rel/riak/etc/app.config
$ ulimit –n 4096
$ rel/riak/bin/riak start
Index作成方法
$ curl -XPUT ¥ -i http://(hostname):8098/yz/index/(indexname) (出力結果) HTTP/1.1 204 No Content Server: MochiWeb/1.1 WebMachine/1.9.2 (someone had painted it blue) Date: Tue, 04 Jun 2013 07:34:13 GMT Content-Type: application/json Content-Length: 0
• hostname
– Riakの動作しているホスト名
• Indexname – 任意の文字列
Bucket->Index マッピング
$ curl -XPUT –i ¥
-H 'content-type: application/json' ¥
'http://(hostname):8098/buckets/(bucketname)/props' ¥
-d '{"props":{"yz_index":"(indexname)"}}‘
• 任意のBucketを全文検索の対象にする
– オブジェクトをstoreする度にSolrインデックスが作成されるようになる
オブジェクト登録のテスト
$ curl -H 'content-type: text/plain' -X PUT ¥
‘http://(hostname):8098/riak/testbucket/testkey’ ¥
-d "Ryan Zezeski"
• Bucket “testbucket”, Key “testkey” にて テキスト ”Ryan Zezeski” をPUTする
Searchのテスト
$ curl ¥ 'http://(hostname):8098/search/testindex?q=text:Ryan’ (出力結果) <response> <lst name="responseHeader"><int name="status">0</int><int name="QTime">47</int><lst name="params"><str name="shards">10.0.2.11:8093/solr/testindex</str><str name="q">text:Ryan</str><str name="fq">(_yz_node:[email protected] AND ((_yz_pn:62 AND (_yz_fpn:62)) OR _yz_pn:61 OR _yz_pn:58 OR _yz_pn:55 OR _yz_pn:52 OR _yz_pn:49 OR _yz_pn:46 OR _yz_pn:43 OR _yz_pn:40 OR _yz_pn:37 OR _yz_pn:34 OR _yz_pn:31 OR _yz_pn:28 OR _yz_pn:25 OR _yz_pn:22 OR _yz_pn:19 OR _yz_pn:16 OR _yz_pn:13 OR _yz_pn:10 OR _yz_pn:7 OR _yz_pn:4 OR _yz_pn:1))</str></lst></lst><result name="response" numFound="1" start="0" maxScore="0.4451987"><doc><str name="_yz_id">testkey_19</str><str name="_yz_ed">20130709T015823 19 testbucket testkey g2IFn+UN</str><str name="_yz_fpn">17</str><str name="_yz_node">[email protected]</str><str name="_yz_pn">19</str><str name="_yz_rk">testkey</str><str name="_yz_rb">testbucket</str></doc></result> </response>
YOKOZUNA 検証結果
Yokozuna 動作検証しました
• ウィキペディア日本語版のdumpデータをstore – 170万件、7GBのデータ
• 検証内容 –沢山のデータを入れても問題なく動くこと
–性能がそれなりに良いこと • store性能
• search性能は、今回は除外
機器構成
Gigabit Ethernet (1Gbps)
Router
The Internet
Riak Node (32台)
ベンチマークPC兼Reverse Proxy
PRIMERGY RX200 S6 • CPU Xeon L5630 @2.13GHz • Memory 24GB • HDD hwRAID5(1TB SATA x8)
Demo • Wikipedia query WebUI
–https://github.com/iij/yokozuna-demo
yz_extractor
• テキストの中身を解析してfield展開する
– text/plain
• yz_text_extractor
– text/json
• yz_json_extractor
– text/xml
• yz_xml_extractor
yz_xml_extractor
• XMLの例 <person>
<name>Ryan</name>
<age>29</age>
</person>
• Field展開後 [{<<"person_name">>, <<"Ryan">>},
{<<"person_age">>, <<"29">>}]
Solr XMLスキーマの変更
• 日本語(text_ja)として形態素解析
• 下記項目を抽出する – <page>
– <title>
– <revision>
– <id>
– <timestamp>
– <text>
<page> <title>言語</title> <ns>0</ns> <id>10</id> <revision> <id>47989880</id> <parentid>47989854</parentid> <timestamp>2013-05-29T08:46:04Z</timestamp> <contributor> <ip>219.116.251.28</ip> </contributor> <comment>/* 各国の国語・公用語 */</comment> <text xml:space="preserve">{{出典の明記|date=2009年5月}} … </text> </revision> </page>
wikipedia_schema.xml
…
<field name="text" type="text_ja" indexed="true" stored="false" multiValued="true"/>
<field name=“page_title" type="text_ja" indexed="true" stored="false" multiValued="false"/>
<field name=“page_id" type="int" indexed="true" stored="false" multiValued="false"/>
<field name=“page_revision_timestamp" type="date" indexed="true" stored="false" multiValued="false"/>
<field name=“page_revision_text" type="text_ja" indexed="true" stored="false" multiValued="false"/>
…
スキーマの変更方法
$ curl -i -XPUT ¥
-H 'content-type: application/xml' ¥
-d @/tmp/wikipedia_schema.xml ¥
(hostname):8098/yz/schema/wikipedia
$ curl -i -XPUT ¥
-H 'content-type: application/json' ¥
-d '{"schema": "wikipedia"}' ¥
(hostname):8098/yz/index/wikipedia
• “/tmp/wikipedia_schema.xml” をインデックス名”wikipedia”のスキーマとして登録する
Store性能のベンチマーク
• wikipedia-jaコンテンツ(xmlファイル)を rubyクライアントのプログラムを用いて全件登録
– Ruby riak-client • https://github.com/basho/riak-ruby-client/tree/master/lib/riak
– wikipedia-yz
• https://github.com/iij/wikipedia-yz
ベンチマーク結果
ノード数 スループット(Clients per sec)
1 227.19
4 270.50
8 270.70
• ベンチマークプログラムの性能が不十分なため、riak cluster の上限値まで達しなかった – Erlang(riakc_pb_socket)版を作る、または basho_bench のドライバとして実装すると高スループット出せそう
– Rubyでさらに高速化する場合は eventmachine , rev あたりが使えそうだけれど、protocol bufferに対応していないのが残念
– Solr の負荷は概ね5-10%程度
まとめ
• Yokozunaはデータをstoreするだけで全文検索できるので便利
• 分散処理の面倒なことは全てYokozunaが引き受けてくれるので、運用が楽にできる