磯部 和広
k-iso****@rozet*****
2012年 10月 31日 (水) 10:31:01 JST
いつもお世話になっております。 助かります! 本日は別のプロジェクトの対応をしないといけないので、 明日試してみます。 (2012/10/30 22:09), Kouhei Sutou wrote: > 須藤です。 > > In <508FB****@rozet*****> > "[groonga-dev,01085] mroongaとgroongaの相互利用について" on Tue, 30 Oct 2012 19:52:10 +0900, > 磯部 和広 <k-iso****@rozet*****> wrote: > >> ドキュメントの探し方が悪いのか、今一つ判らなかったので教えて下さい。 >> >> MySQL上に、mroongaストレージエンジンとして作成したテーブルがある際に、 >> それをgroongaでアクセスするというのは、そもそも可能なのでしょうか。 > はい、できます! > ただ、使い方はドキュメントに書いていなかったかもしれませ > ん。。。できるということだけ書いていて。。。 > >> MySQL側から、管理者としてテーブル作成とデータのロードを最初に行う以外は >> 基本的にselectしかしないイメージです。 >> >> もしもgroongaからアクセス出来て、MySQLのパーサをスキップ出来るなら >> 更なる高速化が望めるかと思いまして・・・ > そうですね! > MySQLのやりとりのところがボトルネックになっているなら高速に > なると思います。 > >> ■やりたい事■ >> >> 下記のようなテーブルがあるとします。 >> >> CREATE TABLE `TEST_DATA_01` ( >> `id` int(11) NOT NULL AUTO_INCREMENT, >> `EN_TEXT` text NOT NULL, >> `JA_TEXT` text NOT NULL, >> PRIMARY KEY (`id`), >> FULLTEXT KEY `EN_TEXT` (`EN_TEXT`), >> FULLTEXT KEY `JA_TEXT` (`JA_TEXT`) >> ) ENGINE=mroonga DEFAULT CHARSET=utf8; >> >> 現在、下記のようなSQL文で頻度を取得しています。 >> >> select 'red pen' as word, count(1) as count >> from TEST_DATA_01 >> where match(EN_TEXT) against ('"red pen"' in boolean mode); >> >> このようにして >> 指定したフレーズと完全マッチした部分があるレコード数 >> を求めたいです。 >> >> 現状では、大文字小文字問わずにマッチしているので >> 同じ仕様で構いません。 > この場合であれば、(HTTPでgroongaにアクセスするなら)以下が > 最速なはずです。 > > まず、groongaサーバーを起動します。 > ユーザーをMySQLを起動しているユーザーとあわせてください。 > > % sudo -u mysql -H groonga --protocol http -s /var/lib/mysql/${データベース名}.mrn > > 以下のようにリクエストします。 > > % curl 'http://localhost:10041/d/select?table=TEST_DATA_01&match_columns=EN_TEXT&query=%22red+pen%22&limit=0&output_columns=_id' > [[0,1351601903.64726,7.70092010498047e-05],[[[1],[["_id","UInt32"]]]]] > > 返ってきたJSONの > > json[1][0][0][0] > > の部分([[...],[[[1], ...]]]の「1」のところ)がレコード数で > す。 > > SQLとの対応は以下の通りです。 > > HTTP | SQL > table=TEST_DATA_01 | from TEST_DATA_01 > match_columns=EN_TEXT | match(EN_TEXT) > query="red pen" | against ('"red pen"' in boolean mode) > > limit=0とoutput_columns=_idはしいて言えば「select 'red pen' > as word, count(1) as count」に対応しています。必要な情報だけ > 取得するための指定です。 > > > 実際のデータで速度を試してみるのがよいと思います。 > groonga側はキャッシュするので速いんじゃないかと思います。 > ただ、mroonga側でデータを更新したかどうかを検出できないので、 > データを更新したときはgroongaサーバーを再起動する必要があり > ます。 > > コードを見るとmroonga側でテーブルを作成・削除するとデータ更新 > を検出しそうですが、試していません。そんなことをしなくても更 > 新を検出できるようにしておきますね。 >