Groongaのチュートリアルを試してみた

Groongaのチュートリアルを試してみたメモです。 試した環境は Groonga 5.0.2, Ubuntu 14.04.2 です。

セットアップ手順

2.4. Ubuntu — Groonga v5.0.2ドキュメントにそってセットアップしました。

セットアップ手順はDockerfileにまとめておきました。

さらにVirtualBox + VagrantでUbuntuにdockerとdocker-composeをインストールして、上のDockerfileでコンテナを作る手順を自動化するVagrantfileを作成して hnakamur/groonga-dockerfiles で公開しています。

VirtualBoxとVagrantをインストールしてあれば、以下の手順ですぐ試せます。

git clone https://github.com/hnakamur/groonga-dockerfiles
cd groonga-dockerfiles
vagrant up

起動後コンテナを作って起動するまでには結構時間がかかります。

$ vagrant ssh

でVMにログインして、以下のようにCommandでgroonga-httpdが実行されたら起動完了です。

$ cd /vagrant/dockerfiles
$ sudo docker-compose ps
      Name             Command             State              Ports
-------------------------------------------------------------------------
dockerfiles_groo   /usr/sbin          Up                 0.0.0.0:80->1004
ngatrusty_1        /groonga-httpd                        1/tcp
                   -g ...

管理画面とgroongaコマンドの起動方法

http://192.168.33.12/ でgroongaの管理画面にアクセスできます。

groongaコマンドの起動方法は以下の通りです。

vagrant ssh

でVMにログインし、

sudo docker exec -it dockerfiles_groongatrusty_1 /bin/bash

でコンテナ内に入り

sudo -u groonga groonga /var/lib/groonga/db/db

でgroongaコマンドを実行します。

groongaコマンドの実行ユーザをrootにするとハマるので注意

groongaコマンドはgroongaで実行するのが重要です。

rootユーザで実行してしまうとエラーにはならないのですが、テーブルなどを作成してもgroongaの管理画面で表示されずハマりました。

groongaのデータベースは最初は1つのファイルですが、テーブルなどを作るとファイルが追加で作成されます。

root@b95446c72160:/# cd /var/lib/groonga/db
root@b95446c72160:/var/lib/groonga/db# ll
total 15332
drwxr-xr-x 2 groonga groonga     4096 Apr 26 14:34 ./
drwxr-xr-x 3 groonga groonga     4096 Apr 26 01:49 ../
-rw-r--r-- 1 groonga groonga     4096 Apr 26 14:33 db
-rw-r--r-- 1 groonga groonga 21245952 Apr 26 14:33 db.0000000
-rw-r--r-- 1 groonga groonga 16842752 Apr 26 14:34 db.0000100
-rw-r--r-- 1 groonga groonga 12857344 Apr 26 14:26 db.0000101
-rw-r--r-- 1 groonga groonga  8437760 Apr 26 14:28 db.0000102
-rw-r--r-- 1 groonga groonga  1085440 Apr 26 14:28 db.0000103
-rw-r--r-- 1 groonga groonga  4198400 Apr 26 14:28 db.0000103.c
-rw-r--r-- 1 groonga groonga  8437760 Apr 26 14:34 db.0000104
-rw-r--r-- 1 groonga groonga  4198400 Apr 26 14:34 db.0000105
-rw-r--r-- 1 groonga groonga  1085440 Apr 26 14:34 db.0000106
-rw-r--r-- 1 groonga groonga  4198400 Apr 26 14:34 db.0000106.c
-rw-r--r-- 1 groonga groonga  1048576 Apr 26 14:34 db.001

rootユーザでgroongaコマンドを実行すると作成されたファイルの所有者がrootユーザになり、groonga-httpdから見えないようです。

chown groonga: /var/lib/groonga/db/db* で所有者をgroongaユーザに変更すれば見えるようになりました。

ということで、上記のようにgroongaユーザでgroongaコマンドを実行するのが良いです。

チュートリアルの一部手順でエラーが出てハマった

4. チュートリアル — Groonga v5.0.2ドキュメントの手順で試してみました。ほとんどはすんなり実行できましたが、1箇所ハマりました。

インデックス付きジオサーチのところでnonexistent sourceというエラー

4.6.3. インデックス付きジオサーチのところで以下の様なエラーが出ました。

> table_create --name GeoIndex --flags TABLE_PAT_KEY --key_type WGS84GeoPoint
[[0,1429178015.01179,0.00191092491149902],true]
> column_create --table GeoIndex --name index_point --type Site --flags COLUMN_INDEX --source location
[[-22,1429178020.73797,0.00554323196411133,"[column][create] nonexistent source: <location>",[["proc_column_create_resolve_source_name","proc.c",1774]]],false]

Siteテーブルは4.1.5. テーブルの作成

table_create --name Site --flags TABLE_HASH_KEY --key_type ShortText

として作成していますが、その後 location カラムを作る箇所がなかったようです。

2015-04-28追記 https://twitter.com/kenhys/status/592901925089189889 でご指摘いただいたのですが、実は4.4.3. 位置情報を用いた絞込・ソートlocation カラムを作っているのを私が見落としていました。失礼いたしました。

column_create --table Site --name location --type WGS84GeoPoint

のようにカラムを作成すれば大丈夫でした。

table_create --name GeoIndex --flags TABLE_PAT_KEY --key_type WGS84GeoPoint
column_create --table GeoIndex --name index_point --type Site --flags COLUMN_INDEX --source location

でインデクス用のテーブルとカラムを作成して、

load --table Site
[
 {"_key":"http://example.org/","location":"128452975x503157902"},
 {"_key":"http://example.net/","location":"128487316x502920929"}
]

で、データをロードします。

> select --table Site --filter 'geo_in_circle(location, "128515259x503187188", 5000)' --output_columns _key,location
[[0,1430061299.24235,0.00105690956115723],[[[1],[["_key","ShortText"],["location","WGS84GeoPoint"]],["http://example.org/","128452975x503157902"]]]]

で検索できました。

まとめ

2箇所ハマりましたが解決してとりあえず使えるようになりました。今後さらに調査していきたいと思います。