groongaをコマンドラインから便利に使うには

> もっとgroongaを知ってもらおう!ということで週刊groongaをはじめました。毎週木曜にgroongaやmroonga、rroongaのトピックを投稿予定です。

いよいよ、[gihyo.jp](http://gihyo.jp/)さんでgroongaの隔週更新連載が始まりました!! 
第7回の記事も公開されたので、一読をおすすめします。

* [「第7回 [実録] MySQL向け全文検索エンジン「Tritonn」から「mroonga」への移行ガイド（2）」](http://gihyo.jp/dev/clip/01/groonga/0007)

第1回から第6回までの過去記事については、[隔週連載groonga](http://gihyo.jp/dev/clip/01/groonga)のページを参照してください。

# はじめに

オープンソースの[カラムストア機能付き全文検索エンジンgroonga](http://groonga.org/ja/)を公開しています。

最新のバージョンは2013年6月29日にリリースした[3.0.5](http://groonga.org/ja/docs/news.html#release-3-0-5)です。

今回は、groongaをコマンドラインから便利に使う方法を紹介します。

# groongaをコマンドラインから使う

groongaをコマンドラインから使うといったときには、以下の2つのタイプがあるでしょう。

* コマンドラインで便利に使う
* 対話モードで便利に使う

前者はgroongaコマンドのオプションをあれこれ指定するような場合です。
後者はgroongaコマンドを実行し、対話モードに入ってからクエリを実行するような場合です。

それぞれのタイプ向けに便利に使う方法があるので以下に紹介します。

## コマンドラインで便利に使う

このタイプでは、シェルの持つ補完機能を拡張するというものがあります。

### Zshの補完関数

Zshを普段使っているのであれば、hhattoさんの書かれたZshの補完関数があります。
補完関数の紹介記事は[groongaのZsh補完関数を書きました](http://www.hexacosa.net/blog/detail/125/)です。

以下のURLにアクセスすると実際の補完関数を参照することができます。(groonga以外にもあれこれと補完関数があります。)

* https://github.com/hhatto/zsh_completions/ 

ご自身のZsh環境に合わせて補完関数を導入してみると良いでしょう。groongaの各種オプションを補完できるようになります。

## 対話モードで便利に使う

groongaコマンド自体はシンプルなつくりなので、対話モードにて履歴機能などは標準では付属していません。
この対話モードを便利に使う方法は以下のようにいくつかあります。

### rlwrap

履歴機能等を使えるようにするよく知られた方法として``rlwrap``を使う方法があります。
``rlwrap``はreadlineを使うことでその機能を提供しています。
以下のようにgroongaコマンドを実行することで、履歴機能が対話モードでも使えるようになります。

```
% rlwrap groonga
```

### grnwrap

``rlwrap``と同じようにreadlineを使うことで履歴機能やカーソル移動を実現するのが``grnwrap``です。
``rlwrap``は汎用的ですが、``grnwrap``はよりgroongaに特化した機能を提供しています。

詳細は[Groongaの対話モードをラップするgrnwrap - from __future__ import nowhere @ はてな](http://d.hatena.ne.jp/michisu/20110416/p1)にありますが、

* タブキーでコマンド名、引数名、テーブル名、ファイルパスの補完
* JSONのインデント表示
* Gオプションでselectの結果をMySQLの\G風にフォーマット
* *.grnなファイルパスを入力するとファイルに書かれたGroongaコマンドを実行

などが使えるようになります。
デフォルトのgroongaのパスが/usr/local/bin/groongaになっていたり、最近追加/削除したコマンドには対応していない点に注意する必要がありますが、結果のインデント表示がサポートされているところは嬉しいポイントです。

MySQLの\G風表示は以下のようになります。

```
% grnwrap -G testdb/db
> select Video
******************************* 1. row *******************************
     _id: 1
    _key: 1
    tags: [u'demo application', u'groonga', u'FTS']
   title: groonga Demo
******************************* 2. row *******************************
     _id: 2
    _key: 2
    tags: [u'demo', u'mroonga', u'FTS']
   title: mroonga Demo
******************************* 3. row *******************************
     _id: 3
    _key: 3
    tags: [u'demo', u'rroonga', u'FTS', u'ruby']
   title: rroonga Demo
******************************* 4. row *******************************
     _id: 4
    _key: 4
    tags: [u'presentation', u'groonga', u'FTS']
   title: groonga Overview
4 records / 4 hits (0.000592947006226 sec)
```

JSONのインデント表示は以下のようになります。(長いので途中で省略)

```
% grnwrap testdb/db
> select Video
[
    [
        0, 
        1374115250.31744, 
        0.00024867057800293
    ], 
    [
        [
            [
                4
            ], 
            [
                [
                    "_id", 
                    "UInt32"
                ], 
                [
                    "_key", 
                    "UInt32"
                ], 
                [
                    "tags", 
                    "Tag"
                ], 
                [
                    "title", 
                    "ShortText"
                ]
            ], 
            [
                1, 
                1, 
                [
                    "demo application", 
                    "groonga", 
                    "FTS"
                ], 
                "groonga Demo"
            ], 
```

### grnline

これも``grnwrap``と目的を同じくしたプログラムです。
履歴機能やカーソル移動などはreadlineを利用して実現しています。

詳細は[Groongaのコマンドラインインタフェースをほんのり使いやすくするgrnlineというラッパーをつくりました](http://not-taihen.ruby.iijgio.com/blog/2013/06/15/grnline/)にありますが、

* 入力時に方向キーでカーソルの移動（Ctrl-Aで先頭に移動とかもできます）
* groongaコマンドの補完
* 入力を履歴として保持
* 出力形式がJSON（デフォルト）のときのみ結果を整形表示

などが使えるようになります。

grnlineはgemで提供されているので、rubyをインストールしている環境では以下のコマンドを実行することで簡単にインストールすることができます。

``
% gem install grnline
``

``grnline``は実行時にgroongaに渡すオプションを明示的に指定することができるようになっているのが、``grnwrap``との違いです。

まだ開発がはじまったばかりで、履歴が保存されなかったりgroongaコマンドの引数に対する補完が実装されていなかったりはしますが、今後に期待のプロジェクトです。

GitHubで開発しているので、我こそはという人はぜひpull requestを送ってみるといいのではないでしょうか。

* https://github.com/yoshihara/grnline

# まとめ

今回は、groongaをコマンドラインから便利に使う方法を紹介しました。

groongaに興味を持ったなら、まずは[インストール](http://groonga.org/ja/docs/install.html)して試してみてください。

groongaの基本的な動作を知るための[チュートリアル](http://groonga.org/ja/docs/tutorial.html)もあります。インストールしたら試してみてください。