2005年04月04日

Senna
先月末より公開された、未来検索ブラジルの成果物。
N-gram&MeCabな全文検索システムです。

たとえば・・・
組み込み型全文検索エンジン Senna : NDO::Weblog

実は、はてなブックマークのブックマーク検索はこの Senna + MySQL で実現されています。

と、導入実績がちゃんとあったりします。
他にも、あんなのやこんなのにも導入されているそうです。

#このメモはsvn Revision 6を対象としています。
#テスト環境はRHL9です。

いけてそうなSennaですが、公開したてということも有りインストールが大変です。
svnでとってきたソースツリーはaclocalとかautoconf,automakeすればインストール出来るのですが
mysqlの全文検索機能に対応させるには一筋縄ではいきません。
むしろ、コンパイルできません。
無理です。

何故かと言うと…
Sennaについてきているmysqlのpatchファイルなのですが、Revision6のAPI仕様に則していなくて
付属のpatchを当てたところで、コンパイルできないのです。


って事で、Senna Revision 6に対応したmysqlのパッチを作りました。

注:レコードをdeleteすると、クエリによっては

ERROR 1030 Got error 134 from table handler

となってしまいます・・・
なので、一時パッチ公開停止orz(なんだかSennaがレコードのdeleteが出来てないような気がする。。。)評価用に使ってください。Senna自体にもパッチ当てればok


mysql 4.0.23用Sennaパッチ(レコードのdeleteを実行するとselectが出来なくなります)
このパッチを当てた後は、aclocal,autoconf,automakeした後、通常のインストール作業を行ってください。

mysqlのインストールの前に、mecabとsennaをインストールしておいてください。
mecabは--enable-mutexオプションをつけてconfigureしておいてください。

これで、mysqlの全文検索機能のエンジンにSennaが利用されるようになります。


mysql 4.0.24の場合…
mysql 4.0.24用Sennaパッチ(レコードのdeleteを実行するとselectが出来なくなります)
4.0.23とほぼ同じですが、makeする前に4つほどファイルを作成する必要があります。


touch ./Docs/Images/cluster-components-1.txt
touch ./Docs/Images/multi-comp-1.txt
touch ./Docs/errmsg-table.texi
touch ./Docs/cl-errmsg-table.texi

パッチ当てた影響で、ドキュメントの再作成処理が入るのですが、なぜかこれらのファイルが足りないようです。
原因については本来の目的とは違う物なので、特に調べてもないです。
4.0.24での注意点は以上です。


実際に動くかどうかも試してみました。


Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 4.0.24-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create table test (a text, fulltext(a));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into test set a='うほあぐぇryhぱrはあゑrftgyふじこlp';
Query OK, 1 row affected (0.21 sec)

mysql> select * from test where match(a) against('ふじこ');
+-------------------------------------+
| a |
+-------------------------------------+
| うほあぐぇryhぱrはあゑrftgyふじこlp |
+-------------------------------------+
1 row in set (0.00 sec)

mysql> select * from test where match(a) against('じこ');
+-------------------------------------+
| a |
+-------------------------------------+
| うほあぐぇryhぱrはあゑrftgyふじこlp |
+-------------------------------------+
1 row in set (0.01 sec)


いい感じね。

ちなみに、現運用系のiYappoのDBをコピーしてきてFULLTEXTインデックスつけてみましたが、ちゃんと動きました。
検索速度もいい感じです。


一応、パッチの補足などを…

  • sen_index_result_*系の関数名をsen_records_*系に変更
  • sen_index_openの引数合わせ
  • myisam/mi_open.cでsennaのindexを開く処理のところにsen_index_createを追加
    つーかindex作成処理がどこにも入ってなかった。(本来ならmyisam/mi_create.cに書くんだろうけど、ごみごみしてるからやめた)


    追記:
    MySQLとSennaの組み合わせがmakeできた。

    このへんに「全文検索専用のデーモンを立ち上げなきゃいけない」とかあったけど、そんなことはなさそう。

    全文検索を行わせる専用のmysqldを立ち上げなきゃいけない、という意味だったです。
    Sennaが、専用デーモンが必要というのではなくて、iYappoで使うとしたら専用のmysqldが必要だなぁ・・と。

    Posted by Yappo at 2005年04月04日 22:11 | TrackBack | 検索システム構築
  • Comments
    Post a comment









    Remember personal info?






    コメントを投稿する前に↓の場所にnospamと入力してください。