pyroongaの挙動

Pocket

GroongaをPythonから扱うのにpyroongaを使ってみたのですが、いくつかハマリポイントがありました。

Groonga serverが必要

rroongaは単独で動作するのに対して、pyroongaはGroongaがserverとして起動している必要があります。

カラム名が予約語だとハマる

pyroongaはテーブル名をクラス名に、カラム名をアトリビュートにマッピングして動作します。したがって、”from”などの予約語がカラム名だとうまく動きません。あまりPythonには詳しくないのですが、これを回避する方法は思いつきませんでした。

複数語のクエリで期待した結果が返ってこないことがあある

いまいち原因がわからないのですが、”foo bar”というようなクエリをコマンドから与えた時に得られる結果と、queryメソッドで同じクエリを与えた時の結果が異なります。ちょっとよくわかりません。

対処: subprocess呼び出し

非常にダサい方法ではありますが、pythonからgroongaコマンドを直接呼び出すことで期待する結果が得られるようになりました。

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import subprocess

grn = "/opt/groonga/bin/groonga"
db = "/home/knok/grmbox/index.db"
gcmd = "select --table Mail --match_columns body --query '%s'"

query = "test query"

cmd = [grn, db, gcmd % query]

#json = commands.getoutput(cmd)
json = subprocess.check_output(cmd)
print(json.decode('utf-8'))

これで期待通りの結果が得られるようになりました。

追記(2015/0512)

ロケールが設定されてない環境(CGIなど)でqueryがunicode文字列の場合、引数をきちんとUTF-8でencodeしてやる必要があります。でないと、UnicodeEncodeErrorが発生します。私はこれで数時間悩みました。