groonga storage engine をDjangoから使う場合
groongaをMySQL経由で使うストレージエンジン「groonga storage engine」ですが、FULLTEXT定義が可能です。
こんな風になります。
CREATE TABLE 'Hoge' ( ・・・ FULLTEXT INDEX (huga) ・・・ ) ENGINE = groonga DEFAULT CHARSET utf8;
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であるかを判定まではしていないようです。