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);

NOTE

リリースまでに使い方が変わる可能性もあります。マルチセクション対応そのものは3段階くらいで進めていく予定になっていますので、将来的にいろいろと変更される可能性があります。

マルチセクション機能はSenna 0.8.0の頃から実装されています。このTritonn側の改変により、Sennaの対応バージョンの変化はありません。従来通り、Senna 1.0.x系でご利用いただけます。

このTritonnの改変により、Sennaの必須バージョンはver1.0.5以上となります。

Tritonn公式サイトのドキュメントはリリースのタイミングで更新したいと思います。