mir the developer このページをアンテナに追加 RSSフィード

ぐるんが!ぐるんが!
* groonga(本体)
* groongaストレージエンジン

2007-06-19

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公式サイトのドキュメントはリリースのタイミングで更新したいと思います。

nkjmnkjm 2007/06/20 00:30 ハヤス!
すばらしぃですなぁ。

yirxsyirxs 2007/06/20 01:29 わくわく!

tasukuchantasukuchan 2007/06/20 01:51 マルチセクションでのインデックス作成はSenna 0.8のころから出来ますが、
*Wの書式はsenna-1.0.5以降の対応でした…訂正。

mirmir 2007/06/20 06:50 訂正しましたー!

minthminth 2007/07/25 15:58 7/20のtritonn-1.0.3で実装されたんでしょうか?
試してみたんですが、巧くいかない・・・orz

minthminth 2007/07/25 23:25 ChangeLog参考にやったのですが、*W1 等を入れると結果が0件・・。文字コードとかEUCなのがまずいんでしょうか・・。
SECTIONALIZEを入れないでインデックスを作成すると、正しく効きはしませんが結果が返ってきたり・・・謎です。
Senna1.0.7でないとだめだったりするんでしょうか?(1.0.5使用)

追伸ですが、ChangeLogにはSETTIONALIZEと書いてありました。

mirmir 2007/07/26 16:40 typoごめんなさい! sectionalize手元でも確認中です・・。

mirmir 2007/08/07 19:51 すみません、マルチセクション検索ができなかったのはバグでした!!近日中にtritonn-1.0.4としてリリースします!

minthminth 2007/08/09 20:04 解析ご苦労さまです!
1.0.4を心待ちにしております〜
(検索項目の重み分けをしたいんですよね〜
 まぁSELECTでゴタゴタ書けばできるんですがSmartにやりたい!w)

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/mir/20070619/p1
Connection: close