Tasuku SUENAGA
a****@razil*****
2008年 4月 18日 (金) 20:40:55 JST
すえながです。 手元のMeCab 0.96 + ipadicで実験をしてみました。 白神山地の場合、 「白神山地」 -> 「白神/山地」 「光る雪 白神山地」 ->「光る/雪/白神山地」 と、検索時には白神と山地が分かれてしまうようです。 この場合には、 '*E-3 白神山地' IN BOOLEAN MODE でヒットする予感がします。 百獣の王の場合、 「百獣の王」 -> 「百獣/の/王」 「ライオン らいおん 百獣の王 ライオン」 -> 「ライオン/らい/おん/百/獣/の/王/ライオン」 と、今度は検索時には百と獣がくっついているようです。 この場合には、 '*E-5 百獣の王'や'*E-7 百獣の王' でヒットする予感がします。 今回のような用途でしたら、 全てのクエリの先頭に「*E-7」のプラグマを付けることで 対応できそうだと思います。 ただし、検索速度については遅くなってしまいます。 詳しくはクエリの書式をごらんください。 http://qwik.jp/senna/query.html とはいえ、実際に検索を動かしてみたわけではないので、 間違ったことを言っている可能性があります… 是非ご確認いただければありがたいです。 Kazutoshi Saeki さんは書きました: > はじめまして。佐伯と申します。 > > Tritonn 1.0.9を全文検索に利用させていただいて > いるのですが、検索漏れを起こすワードがいくつかありまして、 > 原因や解決方法などアドバイスいただければと思っております。 > > ■table > CREATE TABLE `m_test` ( > `img_no` int(11) NOT NULL, > `tags` text, > PRIMARY KEY (`img_no`), > FULLTEXT KEY `test_search` USING MECAB, NORMALIZE, 1024 (`tags`) > ) ENGINE=MyISAM DEFAULT CHARSET=utf8 > > ■データ > insert into m_test (img_no,tags) values (1,'光る雪 ウサギ 白神山地 輝く > 雪'); > insert into m_test (img_no,tags) values (2,'光る雪 ウサギ 白神山地'); > insert into m_test (img_no,tags) values (3,'光る雪 白神山地'); > insert into m_test (img_no,tags) values (4,'白神山地'); > insert into m_test (img_no,tags) values (101,'百獣の王 動物園 哺乳類 茶 アフリカ ライオン キング 動物 ネコ科 肉食獣 オス サファリ 肉食動物 サバンナ 王様'); > insert into m_test (img_no,tags) values (102,'百獣の王 オス 哺乳類 茶 アフリカ 肉食動物 ライオン たてがみ 動物 ネコ科 野生動物 猛獣'); > insert into m_test (img_no,tags) values (103,'ライオン らいおん 百獣の王 ライオン'); > insert into m_test (img_no,tags) values (104,'オス たてがみ 百獣の王 立髪 肉食動物 肉食獣 陸上動物 雄 ライオン 動物園'); > insert into m_test (img_no,tags) values (105,'オス らいおん 百獣の王 肉食動物 迫力 野生 野生動物 ライオン 動物園'); > > ■検索 > mysql> select img_no from m_test where match (tags) against ('+白神山地' IN boolean mode) order by img_no; > +--------+ > | img_no | > +--------+ > | 1 | > | 4 | > > mysql> select img_no from m_test where tags like '%白神山地%'; > +--------+ > | img_no | > +--------+ > | 1 | > | 2 | > | 3 | > | 4 | > > > mysql> select img_no from m_test where match (tags) against ('+百獣の王' IN boolean > mode); > +----------+ > | img_no | > +--------+ > | 101 | > | 102 | > > mysql> select img_no from m_test where tags like '%百獣の王%'; > +--------+ > | img_no | > +--------+ > | 101 | > | 102 | > | 103 | > | 104 | > | 105 | > > > 本番のデータベースではもっと件数が入っている状態ですが、 > 「白神山地」はlikeで170件、matchで20件程度のhit、 > 「百獣の王」はlikeで50件、matchで20件程度のhit、 > という結果になります。 > > > ■サーバー環境 > ・FedoraCore5(Fedora7のサーバーでも同様の結果です) > ・Xeon 3.2GHz * 2 > ・2GB memory > ・Tritonn 1.0.9(RPM、tarballのどちらも同じ結果になりました) > ・my.cnf内の記載一部 > skip-character-set-client-handshake > default-character-set = utf8 > senna-index-type=mecab > > > 9割以上(感覚値99%ぐらい)の単語に関しては問題なく > indexが作られて検索されているようでして、一部の単語に > 関してのみ発生しているように見受けられます。 > > 元がスペース区切りですので、「USING DELIMITED」、で > Indexを作成すると、これらの問題は解決するのですが、コンシューマ > 向けのサービスのため、タグの記載にばらつきが発生しており、 > 他のワードでの検索精度が落ちる結果となっています。 > できればMECABでの検索を行いたいと考えています。 > > 何か解法がありましたら、ぜひご教授くださいませ。 > 宜しくお願い致します。 --- tasuku <a****@razil*****>