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

Back to archive index

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/




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