はじめに
Groongaによる全文検索システムの機能を本当にざっくり分けると以下の2つになると思います。
- データベースを作成・更新する
- データベースから検索して表示する
普通は両方とも同じプロジェクトで行いますが、ちょっとそこにあったどのプロジェクトで使われているかわからないがどうやらGroongaっぽいデータベースの中身を見たいという場面もあるかもしれません。
そんなときのために、既存のデータベースを見る方法をまとめてみました。私が普段使っている方法は大きく分けて3つあります。
- Groonga本体のコマンドを使う
- 各言語バインディングでスクリプトを書く
- データベース管理ツールを使う
順番に例を見ていきますが、以下で挙げる方法はどれもデータベースファイルに対して書き込み権限が必要です。言い換えると、参照だけでなく更新もできてしまうということです。くれぐれもご注意ください。
Groonga本体のコマンドを使う
Groonga本体がインストールされていていれば、以下のように既存のデータベースを開いて対話モードに入ることができます。もしGroongaコマンドで作られたデータベースでなく、例えばRroongaなどで作られたデータベースでも問題ありません。
% groonga /path/to/db
対話モードに入ったら、以下のようにしてレコードを検索することができます。
> table_list
> column_list テーブル名
> select テーブル名 --match_columns カラム名 --query 検索ワード
詳細は以下の文書をご覧ください。
各言語バインディングでスクリプトを書く
Groonga本体のコマンドを使わなくても、Groongaにはたくさんの言語バインディングがあります。それらを使ってデータベースの中を見るスクリプトを書くという方法です。
データベースを作成するのは難しそうですが、参照するだけなら簡単そうな気がしませんか?言語バインディングを使い始めるときは、まず既存のデータベースを検索するためのスクリプトを書くところから始めるのがおすすめです。
例えば、Rroongaを使えば以下のようにして検索スクリプトを書くことができます。
require "groonga"
Groonga::Database.open("/path/to/db") do |database|
p database.tables
users = Groonga["Users"] # Usersテーブルがあった場合
p users.columns
selected_users = users.select do |record|
record.name =~ "検索ワード" # nameカラムがあった場合
end
p selected_users.collect {|record| record._key}
end
データベース管理ツールを使う
Groongaのデータベースを管理するための専用ツールを使う方法です。例えば、Rroongaにはgroonga-database-inspect
というデータベースのサイズなどの情報を見られるコマンドが付属しています。去年のGroonga Advent Calendar 2013でも取り上げられていました。
また、これもRroongaに付属しているコマンドですが、grndump
というデータベースをダンプするためのツールがあります。詳細は以下の記事をご覧ください。
あと、私が開発中のgroonga-database-viewer-gtk
というツールもあります。Rubyをお使いであれば、RubyGems.orgから以下のようにインストールできます。
% gem install groonga-database-viewer-gtk
これは、Ruby/GTK2というGUIライブラリーを使って、Groongaのデータベースを閲覧することができるアプリケーションです。以下のように、コマンドの引数にデータベースのパスを指定するだけで起動できます。
% groonga-database-viewer-gtk /path/to/db
こんな感じで表示されて、カラムを指定しての検索ができます。
インデックスカラムについては、現在は対象レコード数とIDリストを表示していますが、どうするのがいいかは検討中です。
ソースコードはGitHubで公開しています。
myokoym/groonga-database-viewer-gtk ・ GitHub
おわりに
Groongaのデータベースの中を見る方法を3つ紹介しました。独自のバイナリ形式のファイルですが、意外といろいろな方法があることがわかってもらえたかと思います。みなさんも、お好きな言語で練習がてらGroongaデータベース管理ツールを作ってみてはどうでしょうか?