
Sennaのマルチセクション機能に対応しました!
次回のTritonnリリース(ver1.0.3)から利用可能になる予定です! Tritonn 1.0.3は来月あたりにリリースする予定です。
マルチセクション機能とはテーブルに全文検索対象のカラムが複数あるような場合に、非常に便利使える機能です。
以下のようなテーブルがあって、c2/c3/c4の3つのカラムで全文検索をしたい、という場合を想定します。
CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT, c3 TEXT, c4 TEXT) DEFAULT CHARSET utf8;
このとき、これまでは以下のように複合キーとしてFULLTEXTインデックスを作成することで、1度のMATCH検索でc2/c3/c4の何れかにキーワードを含むレコードを探すことができましたが、、、問題もありました。
CREATE FULLTEXT INDEX ft ON t1 (c2,c3,c4);
その問題とは、、、
というようなものです。
何れにしても、こういったようなことをやろうとすると複数のFULLTEXTインデックスを作る必要があり、そうするとメモリとディスクの消費量が大幅に増加するという欠点がありました。
これを1つの複合キーのみでやれるようにしてくれるのが、このマルチセクション機能です。
個々のカラムにインデックスを作成されていた人だったら、インデックス数が削減=メモリが削減されてうれしいかもしれません。
マルチセクション機能は、BOOLEAN MODEでのみ利用できます。
MySQL+SennaではおなじみのUSING句に、新たに"SECTIONALIZE"というキーワードが導入されています。これを利用します。
ALTER TABLE t1 ADD FULLTEXT INDEX ft USING NGRAM, SECTIONALIZE (c2,c3,c4);
BOOLEAN MODEで*W演算子を使って指定します。*Wの後にセクション番号を指定します。
c3のみを検索対象としたい場合。
SELECT * FROM t1 WHERE MATCH(c2,c3,c4) AGAINST("*W2 キーワード" IN BOOLEAN MODE);
c2とc3のみを検索対象にしたい場合。
SELECT * FROM t1 WHERE MATCH(c2,c3,c4) AGAINST("*W1,2 キーワード" IN BOOLEAN MODE);
書式:*Wセクション番号[:スコアの倍率],...
c2を3倍、c3を2倍、c4を1倍で評価したい場合
SELECT * FROM t1 WHERE MATCH(c2,c3,c4) AGAINST("*W1:3,2:2,3:1 キーワード" IN BOOLEAN MODE);
リリースまでに使い方が変わる可能性もあります。マルチセクション対応そのものは3段階くらいで進めていく予定になっていますので、将来的にいろいろと変更される可能性があります。
マルチセクション機能はSenna 0.8.0の頃から実装されています。このTritonn側の改変により、Sennaの対応バージョンの変化はありません。従来通り、Senna 1.0.x系でご利用いただけます。
このTritonnの改変により、Sennaの必須バージョンはver1.0.5以上となります。
Tritonn公式サイトのドキュメントはリリースのタイミングで更新したいと思います。