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

Back to archive index

Kazutoshi Saeki saeki****@onboa*****
2008年 4月 18日 (金) 23:24:58 JST


末永様

佐伯です。
早速のご返答ありがとうございました。

スペース区切りなので、mecabの分解も入力ワードと同じに
なるだろうと勝手に解釈していました。

「白神山地」に関してはご指摘の通り、
> '*E-3 白神山地' IN BOOLEAN MODE
こちらでうまく動きました。

「百獣の王」に関しては、
> '*E-5 百獣の王'や'*E-7 百獣の王'
この辺りでもうまくヒットしなかったです。

その他条件を加えながら見てみたのですが、どうもうまくいかなかったため、
別の方法で試してみました。

CREATE TABLE `m_test` (
  `img_no` int(11) NOT NULL,
  `title` varchar(128),
  `tags` text,
  PRIMARY KEY  (`img_no`),
  FULLTEXT KEY `idx_mecab` USING MECAB, NORMALIZE, 1024 (`title`,`tags`),
  FULLTEXT KEY `idx_delimited` USING DELIMITED, NORMALIZE, 1024 (`tags`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

※前回から、titleというレコードcolumnが増えていますが、
 該当imageのタイトル名が入っているcolumnです。

本番のdumpデータ(約25万レコード)でindexを貼りなおして試したところ、
--------
(select img_no from image_search where match (title,tags) against ('百獣の王' IN boolean mode)) union (select img_no from image_search where match(tags) against ('百獣の王' IN boolean mode));
48 rows in set (0.01 sec)

select count(*) from image_search where tags like '%百獣の王%';
47 row in set (0.55 sec)
--------
1件分はtitleだけにワードが入っているものでしたので、問題無く取れました。
その他の検索に関しても問題ないようです。
更新時の負荷に関しては厳しそうならバッチ処理等で考えてみようと思います。

当初からは想定していた解法が変わりましたが、
ご指摘いただいた事で気づくことができました。
ありがとうございました。

今後とも何卒宜しくお願い申し上げます。


> すえながです。
> 
> 手元の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での検索を行いたいと考えています。
> > 
> > 何か解法がありましたら、ぜひご教授くださいませ。
> > 宜しくお願い致します。




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