Kouhei Sutou
kou****@clear*****
2012年 10月 30日 (火) 22:09:26 JST
須藤です。 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側でテーブルを作成・削除するとデータ更新 を検出しそうですが、試していません。そんなことをしなくても更 新を検出できるようにしておきますね。 -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270) groongaサポート: http://groonga.org/ja/support/ パッチ採用はじめました: http://www.clear-code.com/recruitment/