groonga storage engine をDjangoから使う場合

groongaをMySQL経由で使うストレージエンジン「groonga storage engine」ですが、FULLTEXT定義が可能です。


こんな風になります。

CREATE TABLE 'Hoge' (
・・・
FULLTEXT INDEX (huga)
・・・
) ENGINE = groonga DEFAULT CHARSET utf8;


通常のMySQLのFULLTEXTと思って、Django

Hoge.objects.filter(huga__search=wd)

というFULLTEXTサーチをすると、きちんと検索できてしまいます。

便利。すばらし。



考察

さて、本題はここからです。もしもgroongaストレージエンジンでない場合は、以下のようなエラーが出ます。

TemplateSyntaxError
Caught OperationalError while rendering: (1214, "The used table type doesn't support FULLTEXT indexes")

このテーブルはFULLTEXTに対応していませんとあります。


マニュアルを見てみましょう。



マニュアルの見解

MySQL5.1のマニュアルによると、

MySQL は全文インデックスおよび検索をサポートします :

MySQL の全文インデックスは、タイプ FULLTEXT のインデックスです。

全文インデックスは MyISAM テーブルとのみ使用されており、CHAR 、VARCHAR 、または TEXT カラムのためにだけ作成されます。

となります。

記述と反しますが、MyISAM以外のテーブルであるgroonga storage engineでも全文インデックスは使えます。



djangoのfilter以外を使う例:extras

groongaストレージエンジンなので、ここはMATCH AGAINSTを扱うextrasを使っています。

extrasを使う
#vi views.py

match_expr = "MATCH(%s) AGAINST (%%s)" %("huga")
params_expr = 'search_word'
Hoge.objescts.extra(where = [match_expr], params = [params_expr])


DjangoのO/Rマッパーが、extraメソッドを通過するときに、対象のテーブルのストレージエンジンが、
MyISAMであるかを判定まではしていないようです。

直接SQLを発行するやり方

filterとかextrasで表現できるので、直接のSQL発行はあまりおすすめしません。

以前書いたエントリーを参考にしてください。

DjangoでカスタムSQLを使う場合のプログラム




個人的には、WHERE節を持つSQLを実行する目的であれば、extrasを使ったほうがおすすめです。