GroongaのUTF-8なDBに対してShift_JIS（cmd.exe）で全文検索する3つの方法

[Groonga Advent Calendar 2015](http://qiita.com/advent-calendar/2015/groonga)の**2**日目の記事です。1日目はyoku0825さんの[MySQLで日本語全文検索ができるMroongaのDockerリポジトリーをメンテナンスしています](http://tech.gmo-media.jp/post/134296771997/start-to-maintain-mroonga-docker-image)でした。いつもお世話になっています！

## はじめに

[groonga-dev](http://lists.osdn.me/mailman/listinfo/groonga-dev)というメーリングリストで、[Groonga](http://groonga.org/ja/)のUTF-8のデータベースに対して
コマンドプロンプト（cmd.exe）から日本語を使うにはどうしたらよいか、という話題がありました。

普通にやると、UTF-8のデータベースに対してShift_JISで検索に行ってしまうので、
文字コードの違いのせいでうまく検索できません。

まず思いつくのはコマンドプロンプトの文字コードをUTF-8に設定することですが、
期待する結果は得られませんでした。詳しいことはわかりませんが、以下の原因が考えられます。

* データベースにはShift_JISで渡ってしまうので、検索にヒットしない
* フォントがなくて文字が消えてしまう
* 出力時に文字化けしてしまう

Groongaに限らず、いろいろなソフトウェアで起こりうる問題ではないでしょうか。

最近はLinuxを使っている私ですが、昔はWindowsで生活していたので、昔の記憶を掘り起こしながら
考えてみました。みなさんも考えてみてください。

## A. 日本語を使わない

いくらShift_JISとはいえ、日本語を使わなければ文字化けする心配はありません。
余談ですが、来年からTOEICの出題形式が変わって点が取りづらくなるようです。
私は受けたことありませんが。

## B. データベースの文字コードをShift_JISにする

これが一番オススメです。すべて同じ文字コードで統一してしまえば文字化けの心配はありません。

Groongaの場合は、**データベース作成時**に`--encoding`オプションを指定することでデータベースの
文字コードを変更することができます（デフォルトはUTF-8）。

```
> groonga -n --encoding sjis test.db
```

とはいえ、既存のデータベースがある場合はデータベースを作り直す必要があるので、
選びづらい選択肢ではあります。

## C. 何かで文字コードを変換する

何か別のツールを使用して、入力をUTF-8に変換してからデータベースに渡してやる方法です。

この方法ならデータベースを作り直す必要はありません。ただし、ツールによってはインターフェイスが
大幅に変わってしまうため、過去の資産が使えなくなってしまうおそれがあります。

この話題ではgroongaコマンドによる対話型インターフェイス（REPL）が使われていたので、
同じようなインターフェイスにするのが無難です。

私はRubyが好きなので、Rubyを使ってツールを作ってみることにしました。

既存ツールを調べたところ[groongaコマンドをPryの上で - Qiita](http://qiita.com/arika/items/daa35bec32a680b3240e)がとてもよさそうだったので、
これを参考にPryを使って作ろうとしたのですが、一朝一夕では難しそうだったので諦めました。
余談ですが、締め切りの「締」と諦めの「諦」は似ていますね。

そこでもっとシンプルな方法を探していたところ、Rubyの標準添付ライブラリにReadlineがある
のを見つけました。

http://docs.ruby-lang.org/ja/search/version:2.2.0/query:readline/

使い方も簡単そうだったので、これを採用することにしました。でき上がったのが以下です。

https://github.com/myokoym/grnlip

メイン処理部分:
https://github.com/myokoym/grnlip/blob/master/exe/grnlip

RubyGems.orgに公開してあるので、以下のコマンドでインストールできます。

```
gem install grnlip
```

以下のコマンドで、UTF-8なDBに対してShift_JISで全文検索できる対話型インターフェイスが
起動します。引数には、groonga.exeのパスとデータベースのパス、そして文字コードを指定します。

```
> grnlip \path\to\groonga.exe \path\to\db utf-8
```

<del>複数行の入力に対応していなかったりしますが、</del>(*1) そのかわりコマンドごとにpretty-printできる機能を
おまけで付けてあります。コマンドの先頭に`pp`を付けると、そのコマンドだけ整形されて表示されます。

(*1) バージョン0.1.1で対応しました。

以下はLinuxで実行した例です。

```
% grnlip groonga ~/.feedcellar/db/feedcellar.db
groonga(feedcellar.db)> status
[[0,1449073618.25274,0.00140500068664551],{"alloc_count":200,"starttime":1449073618,"start_time":1449073618,"uptime":0,"version":"5.1.0","n_queries":0,"cache_hit_rate":0.0,"command_version":1,"default_command_version":1,"max_command_version":2}]
groonga(feedcellar.db)> pp status
[
  [
    0,
    1449073621.71188,
    9.48905944824219e-05
  ],
  {
    "alloc_count": 200,
    "starttime": 1449073621,
    "start_time": 1449073621,
    "uptime": 0,
    "version": "5.1.0",
    "n_queries": 0,
    "cache_hit_rate": 0.0,
    "command_version": 1,
    "default_command_version": 1,
    "max_command_version": 2
  }
]
```

Groonga 5.1.0以降ではgroongaコマンドにpretty print機能が追加されたので、そちらを使うこともできます。

7.3.3. プリティープリント — Groonga v5.1.0ドキュメント
http://groonga.org/ja/docs/reference/command/pretty_print.html

## おわりに

UTF-8なデータベースに対して、コマンドプロンプト上で日本語を使う方法を2つ紹介しました。
参考になれば幸いです。