Yokozuna 日本語検索機能を評価しました

4,413 views

Published on

Published in: Technology
0 Comments
9 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,413
On SlideShare
0
From Embeds
0
Number of Embeds
658
Actions
Shares
0
Downloads
14
Comments
0
Likes
9
Embeds 0
No embeds

No notes for slide

Yokozuna 日本語検索機能を評価しました

  1. 1. Yokozuna日本語検索機能を 評価しました Takashi Sogabe(@rev4t) Yoshihisa Tanaka (@yosisa) Internet Initiative Japan., Inc.
  2. 2. 質問 • Riakに入れたデータ、どのように取り出してい ますか? – Key を直接指定 – Secondary Index – Map/Reduce – Riak Search – Mohair
  3. 3. 検索機能はとても便利 • Gmail • Evernote 膨大な量のデータが入っていても、 すぐに検索結果が返ってくる!
  4. 4. しかし検索機能は実装が大変.. • 膨大な構造化がされていないデータ – Email – チャット – 日記 – etc.
  5. 5. 全文検索エンジンの運用 • Namazu, Senna, Hyper Estrayer, Lucene/Solr, etc... – オリジナルデータの保管方法 – リアルタイムにインデックス作っても大丈夫? – スケールアウト簡単にできる?
  6. 6. Yokozuna • https://github.com/basho/yokozuna • Yokozuna = Riak + Solr – Riak と Solr の良いところ取り – Riakの運用+αで全文検索ができるようになる – 色々考えなくても簡単にスケールアウトする – Solrと同じQueryが使える
  7. 7. Riak Searchとの違い • Riak Search – 多言語への対応が弱い • 日本語の形態素解析 – Solrの方が検索機能が充実している • スコアリング、ファセット検索、検索結果のハイライト, etc.
  8. 8. ソフトウェア構成 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
  9. 9. YOKOZUNA 使い方
  10. 10. インストール手順(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++)
  11. 11. インストール手順(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
  12. 12. 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 – 任意の文字列
  13. 13. Bucket->Index マッピング $ curl -XPUT –i ¥ -H 'content-type: application/json' ¥ 'http://(hostname):8098/buckets/(bucketname)/props' ¥ -d '{"props":{"yz_index":"(indexname)"}}‘ • 任意のBucketを全文検索の対象にする – オブジェクトをstoreする度にSolrインデックスが作成される ようになる
  14. 14. オブジェクト登録のテスト $ curl -H 'content-type: text/plain' -X PUT ¥ ‘http://(hostname):8098/riak/testbucket/testkey’ ¥ -d "Ryan Zezeski" • Bucket “testbucket”, Key “testkey” にて テキス ト ”Ryan Zezeski” をPUTする
  15. 15. 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:riak@10.0.2.11 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">riak@10.0.2.11</str><str name="_yz_pn">19</str><str name="_yz_rk">testkey</str><str name="_yz_rb">testbucket</str></doc></result> </response>
  16. 16. YOKOZUNA 検証結果
  17. 17. Yokozuna 動作検証しました • ウィキペディア日本語版のdumpデータを store – 170万件、7GBのデータ • 検証内容 – 沢山のデータを入れても問題なく動くこと – 性能がそれなりに良いこと • store性能 • search性能は、今回は除外
  18. 18. 機器構成 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)
  19. 19. Demo • Wikipedia query WebUI – https://github.com/iij/yokozuna-demo
  20. 20. yz_extractor • テキストの中身を解析してfield展開する – text/plain • yz_text_extractor – text/json • yz_json_extractor – text/xml • yz_xml_extractor
  21. 21. yz_xml_extractor • XMLの例 <person> <name>Ryan</name> <age>29</age> </person> • Field展開後 [{<<"person_name">>, <<"Ryan">>}, {<<"person_age">>, <<"29">>}]
  22. 22. 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>
  23. 23. 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"/> …
  24. 24. スキーマの変更方法 $ 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”のスキーマとして登録する
  25. 25. 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
  26. 26. ベンチマーク結果 ノード数 スループット(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%程度
  27. 27. まとめ • Yokozunaはデータをstoreするだけで全文検 索できるので便利 • 分散処理の面倒なことは全てYokozunaが引 き受けてくれるので、運用が楽にできる

×