Groongaのサジェスト機能を手軽に試す


[前回](http://qiita.com/tamano/items/58cd40387a5e3f4ac886)「そもそも間違わないようにしてあげる」という部分が試せなかったので、今回はサンプルを使って実現してみた。
なお、今回取り扱う内容は[ここ](http://groonga.org/ja/docs/reference/suggest/introduction.html#completion)にドキュメントされている。

# 前提
- OSX Yosemite
- Ruby 2.0以上がインストール済み
- groongaはインストール済み(homebrew)

# 手順
## 1. データベースの準備

まずはデータベースをを作る(今回は`/tmp/db/suggest_db`)

```
groonga -n /tmp/db/suggest_db quit

groonga-suggest-create-dataset db/suggest_db dictionary

```

## 2. データの投入
今回は、groongaのソースコードに同梱されているツールを使って、辞書を用意した。
以下のツール(`edict-import.sh`)でデータをダウンロードして、先ほど作った`/tmp/db/suggest_db`に投入している。

```sh:データ投入
wget http://packages.groonga.org/source/groonga/groonga-6.0.5.tar.gz
tar zxvf //groonga-6.0.5.tar.gz
cd /groonga-6.0.5/examples/dictionary/edict/
./edict-import.sh /tmp/db/suggest_db
```

注意: OSXで動かしたい場合は、 `./edict-import.sh`の中の`zcat`を`gzcat`に書き換える必要あり (2016.07.01時点)

うまくいくと、以下のように224760件(2016.07.01時点)のデータが投入された事が分かる。

```text:データの投入を確認
groonga db/suggest_db select item_dictionary

[[0,1467373551.1142,0.00647878646850586],[[[224760],[["_id","UInt32"],["_key","ShortText"],["boost","Int32"],["buzz","Int32"],["co","UInt32"],["edict_desc","ShortText"],["freq","Int32"],["freq2","Int32"],["kana","kana"],["last","Time"]],[1," ???",0,0,0,"EDICT, EDICT_SUB(P), EDICT2 Japanese-English Electronic Dictionary Files/Copyright Electronic Dictionary Research & Development Group - 2014/Created: 2016-06-30/",0,0,[" ???"],0.0],[22,"(w",0,0,0,"[わらい] (n) (abbr) (sl) LOL/haha/",0,0,["ワライ"],0.0],[23,"+α",0,0,0,"[プラスアルファ] (n) a little more than usual (wasei: plus alpha)/bribe money added to a regular fee/and then some/",0,0,["プラスアルファ"],0.0],[40,"090金融",0,0,0,"[ゼロキューゼロきんゆう] (n) \"090\" financing/loan sharks operating from a cellphone (i.e. without a fixed phone number)/",0,0,["ゼロキューゼロキンユウ"],0.0],[41,"1",0,0,0,"[いち] (num,pref) (1) one/(adj-no,suf) (2) best/(adj-no) (3) first/foremost/(n) (4) beginning/start/(5) bottom string (on a shamisen, etc.)/",0,0,["イチ"],0.0],[42,"1.5次会",0,0,0,"[いってんごじかい] (n) informal wedding ceremony/",0,0,["イッテンゴジカイ"],0.0],[43,"1000円",0,0,0,"[せんえん] (n) 1000 yen/(P)/",0,0,["センエン"],0.0],[44,"100円ショップ",0,0,0,"[ひゃくえんショップ] (n) hundred-yen store/(P)/",0,0,["ヒャクエンショップ"],0.0],[46,"100円均一",0,0,0,"[ひゃくえんきんいち] (n) (abbr) hundred-yen store/100 yen store/",0,0,["ヒャクエンキンイチ"],0.0],[47,"100円均一ショップ",0,0,0,"[ひゃくえんきんいちショップ] (n) hundred-yen store/100 yen store/",0,0,["ヒャクエンキンイチショップ"],0.0]]]]
```

## 3. 実際に試してみる

以下のコマンドを実行して、groongaをhttpサーバモードで起動する。

```groongaをhttpサーバモードで起動
groonga --document-root groonga-6.0.5/examples/dictionary/html --protocol http -s /tmp/db/suggest_db
```

その上で、`http://localhost:10041`にアクセスするとサジェストが試せる。
なお、実際にgroongaサーバにクエリを投げているのは`groonga-6.0.5/examples/dictionary/html/js/dictionary.js`なので、どんなクエリを投げているかはこのファイルの65行目付近を参照の事。


# おまけ

- 上記のhttpサーバモードのgroongaをプロダクション環境でそのまま使っていいの？
    - 以下の問題点が解決できるならOK
        - groongaのhttpサーバモードはシャットダウンなどのコマンドもURLで受け付けてしまうため、不要なコマンドをきちんとアクセス出来ないようにする必要がある。
	        - `/d/suggest`と、監視用の`/d/status`以外は止めてよい。
        - サジェスト機能でユーザーの入力を学習させたい場合は、ユーザーのアクセスログの収集と解析が必要だが、groongaのhttpサーバモードではログを取得できない。
            - 取得したい場合は、自前のアプリを前段に置いてgroongaへのアクセスを中継する。もしくは、`groonga-suggest-httpd`というツールがあるので、そっちを使う。
                - `groonga-suggest-httpd`は現在のhomebrew版のgroongaでは動かない :sob: 

- 上記の話題の流れの中で、groongaをサービスとして動かせないと運用が大変ではと言ったら、ちゃんとパッケージがある事を教えていただいた。
    - 詳細は[こちら](http://groonga.org/ja/docs/server/package.html#groonga-httpd)
    - こちらはNginxベースなので特定のURL以外を止めたりするのやりやすそう。