[Senna-dev 823] Re: Mecabでの検索漏れに関して

Back to archive index

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*****>




Senna-dev メーリングリストの案内
Back to archive index