もっとGroongaを知ってもらおう!ということで週刊Groongaをはじめました。毎週木曜にGroongaやMroonga、Rroongaのトピックを投稿予定です。
gihyo.jpさんでGroongaの隔週連載が最終回を迎えました。Groongaの最新情報と今後に興味があれば一読をおすすめします。該当記事は「最終回 Groongaの今と未来」 です。
第1回から第10回までの過去記事については、隔週連載Groongaのページを参照してください。
今年も11/29に全文検索エンジンGroongaを囲む夕べ4を開催することになりました。Groongaのいろんな話を聞きたい人にはおすすめです。まだ若干余裕はありますが定員間近なので参加登録はお早めに! 発表者も決まったのでタイムテーブルに反映しました!
はじめに
オープンソースのカラムストア機能付き全文検索エンジンGroongaを公開しています。最新のバージョンは2013年10月29日にリリースした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をコマンドラインから便利に使うにはという記事を以前書いたので参考にしてみてください。
テーブルとの対応を調べるには
Groongaではtable_listという組み込みのコマンドがあるので、これを使います。
> 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という組み込みのコマンドがあるので、これを使います。
> 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情報を確認するスクリプトを書いてくれています。
権限のことを考えなくても良いように、一旦/tmp/以下にコピーしたデータベースファイルで調べるには上記のスクリプトをちょっとだけ修正してデータベースのパスを指定してあげます。
# -*- 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のファイルも似たようにして調べることができます。
例えば、testデータベースについて調べるなら、上記のスクリプトで対象となるデータベースとしてtest.mrnファイルを指定します。
db = Groonga::Database.open("/tmp/mysql/test.mrn")
まとめ
今回は、Rroongaで全文検索エンジンGroongaのデータベースファイルとの対応を調べる方法を紹介しました。
Groongaに興味を持ったなら、まずはインストールして試してみてください。
Groongaの基本的な動作を知るためのチュートリアルもあります。インストールしたら試してみてください。