[groonga-dev,01087] Re: mroongaとgroongaの相互利用について

Back to archive index

磯部 和広 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側でテーブルを作成・削除するとデータ更新
> を検出しそうですが、試していません。そんなことをしなくても更
> 新を検出できるようにしておきますね。
>




groonga-dev メーリングリストの案内
Back to archive index