Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

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

4.570 Aufrufe

Veröffentlicht am

Veröffentlicht in: Technologie
  • Als Erste(r) kommentieren

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が引 き受けてくれるので、運用が楽にできる

×