Sennaのマルチセクション機能に対応
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);
その問題とは、、、
- c2だけで検索したいなど複合キーの一部のみを指定して検索したいような場合、別途それようのFULLTEXTインデックスを作成しておく必要があった。
- c2はタイトル、c3は要約、c4は本文、みたいなデータが入っているテーブルで、キーワードがhitした場合、c2 > c3 > c4 みたいに重み付けをやりたい場合があっても、クエリ1発ではできなかった。(アプリで工夫しなければ実現できなかった。)
というようなものです。
何れにしても、こういったようなことをやろうとすると複数の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);