Rroongaを使って全文検索エンジンのテーブル/カラムと実ファイルとの対応を調べるには

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

[gihyo.jp](http://gihyo.jp/)さんでGroongaの隔週連載が最終回を迎えました。Groongaの最新情報と今後に興味があれば一読をおすすめします。該当記事は[「最終回　Groongaの今と未来」](http://gihyo.jp/dev/clip/01/groonga/0011) です。

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

今年も11/29に[全文検索エンジンGroongaを囲む夕べ4](http://atnd.org/events/43461)を開催することになりました。Groongaのいろんな話を聞きたい人にはおすすめです。まだ若干余裕はありますが定員間近なので参加登録はお早めに! 発表者も決まったので[タイムテーブル](http://atnd.org/events/43461#time-table)に反映しました！

# はじめに

オープンソースの[カラムストア機能付き全文検索エンジンGroonga](http://groonga.org/ja/)を公開しています。最新のバージョンは2013年10月29日にリリースした[3.0.9](http://groonga.org/ja/docs/news.html#release-3-0-9)です。

今回は、RroongaでGroongaデータベースファイルとの対応を調べる方法について紹介します。

# Groongaのファイル構成について

全文検索エンジンであるGroongaをパッケージで導入すると、通常/var/lib/groonga以下にデータベースファイルが配置されます。

```
% ls /var/lib/groonga/db
db  db.0000000	db.0000100  db.0000101	db.0000102  db.0000103	db.0000104  db.0000105	db.0000106  db.0000107	db.001
```

普段はあまり気にする必要はありませんが、どのファイルに実データが入っているのかというのを知りたくなることがあります。

容量の都合でデータベース単位でごっそり高速にアクセスできるデバイスに移動することができないので、一部のテーブルのみ移動したいというような場合が具体的な例としてあげられるでしょう。

|ファイル|説明|
|-------|---|
|db|Groongaのデータベースファイル。groongaコマンドに指定するファイルはこれ。|
|db.XXXXXXX|テーブルもしくはカラムの実データが格納されているファイル。|
|db.001|内部で使っている参照ロックフリーなダブル配列のデータを格納しているファイル。|
|db.XXXXXXX.001|db.XXXXXXXで収まりきらなくなったデータを格納しているファイル。|
|db.XXXXXXX.c|転置インデックスで使うデータが格納されているファイル。|

では、実際にgroongaコマンドを使って確認してみましょう。

次のようにしてデータベースにコマンドラインインタフェースを使って対話的にアクセスします。

```
% sudo groonga /var/lib/groonga/db/db
```

素のgroongaコマンドでは履歴を再利用したりするのに不便なので、rlwrapなどを組合せて使うと良いでしょう。このあたりのことは、[Groongaをコマンドラインから便利に使うには](http://qiita.com/groonga/items/5f0173b70cdd786b50bf)という記事を以前書いたので参考にしてみてください。

## テーブルとの対応を調べるには

Groongaでは[table_list](http://groonga.org/ja/docs/reference/commands/table_list.html)という組み込みのコマンドがあるので、これを使います。

```
> table_list
[[0,1384409892.67481,0.00128817558288574],[[["id","UInt32"],["name","ShortText"],["path","ShortText"],["flags","ShortText"],["domain","ShortText"],["range","ShortText"],["default_tokenizer","ShortText"],["normalizer","ShortText"]],[261,"Books","/var/lib/groonga/db/db.0000105","TABLE_PAT_KEY|PERSISTENT","ShortText",null,"TokenBigram",null],[259,"hoge","/var/lib/groonga/db/db.0000103","TABLE_PAT_KEY|PERSISTENT","Int8",null,null,null],[256,"test","/var/lib/groonga/db/db.0000100","TABLE_PAT_KEY|PERSISTENT","Int8",null,null,null]]]
```

ずらりとテーブルのリストが表示されていることがわかります。
testテーブルについて抜きだしてみます。

```
[256,"test","/var/lib/groonga/db/db.0000100","TABLE_PAT_KEY|PERSISTENT","Int8",null,null,null]
```

testテーブルに対応するファイルは、"/var/lib/groonga/db/db.0000100"であることがわかりました。

## カラムとの対応を調べるには

今度は、カラムがどのファイルに対応しているのかを調べてみましょう。

Groongaでは[column_list](http://groonga.org/ja/docs/reference/commands/column_list.html)という組み込みのコマンドがあるので、これを使います。

```
> column_list test
[[0,1384409896.44265,0.000240087509155273],[[["id","UInt32"],["name","ShortText"],["path","ShortText"],["type","ShortText"],["flags","ShortText"],["domain","ShortText"],["range","ShortText"],["source","ShortText"]],[256,"_key","","","COLUMN_SCALAR","test","Int8",[]],[257,"content","/var/lib/groonga/db/db.0000101","var","COLUMN_SCALAR|PERSISTENT","test","Text",[]],[258,"dddd","/var/lib/groonga/db/db.0000102","var","COLUMN_SCALAR|PERSISTENT","test","ShortText",[]]]]
```

カラムに対応してるファイルは次のように対応していることがわかりました。

* "/var/lib/groonga/db/db.0000101" (contentカラム)
* "/var/lib/groonga/db/db.0000102" (ddddカラム)

## Rroongaでテーブル/カラムの対応を調べるには

Groongaの組み込みコマンドで直接調べる以外にも、GroongaのRubyバインディングであるRroongaを使って調べあげることもできます。

例えば、瀧内さんが[Groongaのtable/column情報を確認するスクリプト](https://gist.github.com/genki/7430537)を書いてくれています。

権限のことを考えなくても良いように、一旦/tmp/以下にコピーしたデータベースファイルで調べるには上記のスクリプトをちょっとだけ修正してデータベースのパスを指定してあげます。

```ruby
# -*- coding: utf-8 -*-
require "groonga"

db = Groonga::Database.open("/tmp/groonga/db/db")
db.tables.each do |table|
  print "TABLE: #{table.name} ("
  print "k:#{table.domain.name} " if table.domain
  print "v:#{table.range.name} " if table.range
  puts "#{table.size} records) /#{File.basename table.path}"
  table.columns.each do |column|
    print " - #{column.name}: #{column.range.name}"
    puts " /#{File.basename column.path}"
  end
end
```

実行してみると次のような結果が得られました。

```
% ruby groonga_info.rb
TABLE: Books (k:ShortText 7 records) /db.0000105
 - Books.description: ShortText /db.0000107
 - Books.title: ShortText /db.0000106
TABLE: hoge (k:Int8 0 records) /db.0000103
 - hoge.names: ShortText /db.0000104
TABLE: test (k:Int8 3 records) /db.0000100
 - test.content: Text /db.0000101
 - test.dddd: ShortText /db.0000102
```

さすがに直接組み込みコマンドを実行するよりだいぶ見易いですね。

MySQLで高速な全文検索を実現するためのソフトウェアである[Mroonga](http://mroonga.org/ja)のファイルも似たようにして調べることができます。
例えば、testデータベースについて調べるなら、上記のスクリプトで対象となるデータベースとしてtest.mrnファイルを指定します。

```
db = Groonga::Database.open("/tmp/mysql/test.mrn")
```

# まとめ

今回は、Rroongaで全文検索エンジンGroongaのデータベースファイルとの対応を調べる方法を紹介しました。

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

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