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

27
Yokozuna日本語検索機能を 評価しました Takashi Sogabe(@rev4t) Yoshihisa Tanaka (@yosisa) Internet Initiative Japan., Inc.

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

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

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

Takashi Sogabe(@rev4t)

Yoshihisa Tanaka (@yosisa)

Internet Initiative Japan., Inc.

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

質問

• Riakに入れたデータ、どのように取り出していますか?

– Key を直接指定

– Secondary Index

– Map/Reduce

– Riak Search

– Mohair

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

検索機能はとても便利

• Gmail

• Evernote

膨大な量のデータが入っていても、

すぐに検索結果が返ってくる!

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

しかし検索機能は実装が大変..

• 膨大な構造化がされていないデータ

– Email

–チャット

–日記

– etc.

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

全文検索エンジンの運用

• Namazu, Senna, Hyper Estrayer, Lucene/Solr, etc...

–オリジナルデータの保管方法

– リアルタイムにインデックス作っても大丈夫?

–スケールアウト簡単にできる?

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

Yokozuna

• https://github.com/basho/yokozuna

• Yokozuna = Riak + Solr

– Riak と Solr の良いところ取り

– Riakの運用+αで全文検索ができるようになる

–色々考えなくても簡単にスケールアウトする

– Solrと同じQueryが使える

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

Riak Searchとの違い

• Riak Search

–多言語への対応が弱い

• 日本語の形態素解析

– Solrの方が検索機能が充実している

• スコアリング、ファセット検索、検索結果のハイライト, etc.

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

ソフトウェア構成

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

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

YOKOZUNA 使い方

Page 10: 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++)

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

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 – 任意の文字列

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

Bucket->Index マッピング

$ curl -XPUT –i ¥

-H 'content-type: application/json' ¥

'http://(hostname):8098/buckets/(bucketname)/props' ¥

-d '{"props":{"yz_index":"(indexname)"}}‘

• 任意のBucketを全文検索の対象にする

– オブジェクトをstoreする度にSolrインデックスが作成されるようになる

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

オブジェクト登録のテスト

$ curl -H 'content-type: text/plain' -X PUT ¥

‘http://(hostname):8098/riak/testbucket/testkey’ ¥

-d "Ryan Zezeski"

• Bucket “testbucket”, Key “testkey” にて テキスト ”Ryan Zezeski” をPUTする

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

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>

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

YOKOZUNA 検証結果

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

Yokozuna 動作検証しました

• ウィキペディア日本語版のdumpデータをstore – 170万件、7GBのデータ

• 検証内容 –沢山のデータを入れても問題なく動くこと

–性能がそれなりに良いこと • store性能

• search性能は、今回は除外

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

機器構成

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)

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

yz_extractor

• テキストの中身を解析してfield展開する

– text/plain

• yz_text_extractor

– text/json

• yz_json_extractor

– text/xml

• yz_xml_extractor

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

yz_xml_extractor

• XMLの例 <person>

<name>Ryan</name>

<age>29</age>

</person>

• Field展開後 [{<<"person_name">>, <<"Ryan">>},

{<<"person_age">>, <<"29">>}]

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

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>

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

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"/>

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

スキーマの変更方法

$ 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”のスキーマとして登録する

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

ベンチマーク結果

ノード数 スループット(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%程度

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

まとめ

• Yokozunaはデータをstoreするだけで全文検索できるので便利

• 分散処理の面倒なことは全てYokozunaが引き受けてくれるので、運用が楽にできる