[Senna-dev 658] Re: DORで数千単語を検索すると検索結果が0件になる

アーカイブの一覧に戻る

morit****@razil***** morit****@razil*****
2007年 8月 13日 (月) 13:16:33 JST


こんにちは、森です。

Sennaではヒットしたレコードの情報を内部のハッシュテーブルに一旦全て登録します。
その時に消費するメモリは、32bit環境なら検索結果1件につきおよそ48byte程度になると
思います。100万件がヒットすると48MByte消費するぐらいの計算です。

そのほかに、検索語に対応する転置インデックスの領域を一時的にメモリにマッピングします。
この量はインデックスに登録されている文書件数や指定した検索語の数に応じて増加します。

今回のケースでは、ft_init_boolean_searchの中で
"too long query"という警告が出ているので、
こちらがネックになっているようです。

tritonnの、myisam/ft_boolean_search.cの25行目で

#define SENNA_MAX_N_EXPR 32

と定義されていますので、この数をもっと大きくすれば、
現在よりも多くの単語で検索することができる可能性があります。

>>> yukio ishi さんは書きました:
> こんにちは、石野です。
> 
> senna.log には以下のように出力されました。
> メモリ不足だとすると、1件のマッチにつきどの程度のメモリを使用するのでしょうか?
> ちなみにメモリ1GBのPCを使用して試しているのですが、その場合は何件程度のマッチまで
> 耐えられるか把握できると助かります。
> 
> ・1000単語のOR(12件ヒット)
> 
> 08/13:10:41:44.162061|i| ft_init_boolean_search => sen_query_open: str='*DOR
> 草水 草摺 草瀬 草生 草生さ 草生し 草生しゃ ... 略
> 08/13:10:41:44.162285|d| ft_init_boolean_search => sen_query_rest:
> q=0x8a24e28, rest=0x41fe4f8c
> 08/13:10:41:44.162298|w| ft_init_boolean_search: too long query. rest(草津川
> 草津線 草津総合病院 草津電機 草津東 草津峠 ... 略
> 8/13:10:41:44.162396|d| ft_init_boolean_search => sen_records_open
> 08/13:10:41:44.162410|i| ft_init_boolean_search => sen_query_exec:
> i=0x89db780, q=0x8a24e28, r=0x8a175d8
> 08/13:10:41:44.162423|d| mode=0 option=0 w=5 o=0
> 08/13:10:41:44.162526|i| n=1 (草水)
> 08/13:10:41:44.162573|d| mode=0 option=0 w=5 o=0
> 08/13:10:41:44.162606|i| n=1 (草摺)
> 08/13:10:41:44.162863|d| mode=0 option=0 w=5 o=0
> 08/13:10:41:44.162881|d| mode=0 option=0 w=5 o=0
> 08/13:10:41:44.162897|d| mode=0 option=0 w=5 o=0
> ... 略
> 08/13:10:41:44.163284|i| n=1 (草地)
> 08/13:10:41:44.163296|d| mode=0 option=0 w=5 o=0
> 08/13:10:41:44.163313|i| n=1 (草地)
> 08/13:10:41:44.163325|d| mode=0 option=0 w=5 o=0
> 08/13:10:41:44.163341|d| mode=0 option=0 w=5 o=0
> 08/13:10:41:44.163372|i| n=1 (草津)
> 08/13:10:41:44.163386|d| mode=0 option=0 w=5 o=0
> 08/13:10:41:44.163403|i| n=1 (草津)
> 08/13:10:41:44.163416|d| mode=0 option=0 w=5 o=0
> 08/13:10:41:44.163456|i| n=2 (草津港)
> 08/13:10:41:44.163470|d| mode=0 option=0 w=5 o=0
> 08/13:10:41:44.163500|i| hits(exact)=12
> 
> ・5000単語のOR(0件ヒット)
> 
> 08/13:10:43:26.161732|i| ft_init_nlq_search => sen_index_sel
> index=0x89db780, string='*DOR 草水 草摺 草瀬 草生 草生さ ... 略
> 08/13:10:43:26.162447|i| sen_index_sel > (*DOR 草水 草摺 草瀬 草生 草生さ 草生し 草生しゃ 草生す
> 草生せ 草生せ 草生そ ... 略
> 08/13:10:43:26.163559|i| exact: 0
> 08/13:10:43:26.163964|i| unsplit: 0
> 08/13:10:43:26.164383|i| partial: 0
> 08/13:10:43:26.164396|i| hits=0
> 
> ・10000単語のOR(0件ヒット)
> 
> 08/13:11:12:25.898474|i| ft_init_nlq_search => sen_index_sel
> index=0x89db780, string='*DOR 草水 草摺 草瀬 草生 草生さ ... 略
> 08/13:11:12:25.899846|i| sen_index_sel > (*DOR 草水 草摺 草瀬 草生 草生さ 草生し 草生しゃ 草生す
> 草生せ 草生せ 草生そ ... 略
> 08/13:11:12:25.901942|i| exact: 0
> 08/13:11:12:25.902747|i| unsplit: 0
> 08/13:11:12:25.903599|i| partial: 0
> 08/13:11:12:25.903614|i| hits=0
> 
> 
> 07/08/10 に Tasuku SUENAGA <a****@razil*****> さんは書きました:
> >
> > 末永です。
> > こんにちは。
> >
> > Sennaのログはどのように出力されていますでしょうか。
> >
> > おそらくメモリ不足だと思われます…
> > ランダム値の場合にはマッチする結果が存在しないため、
> > 結果が増えずメモリが不足しないものと予想します。
> >
> > yukio ishi さんは書きました:
> > > こんにちは、石野です。お世話になります。
> > >
> > > Senna+mysql+tritonnで、medab辞書の単語をDORの後に連結して、DBに蓄積してあったデータを検索しているのですが、
> > >
> > >   mysql> SELECT count(*) FROM table_name WHERE MATCH(column_name)
> > > AGAINST('*DOR 単語1 単語2 単語3 ... 略 ' in boolean mode);
> > >
> > > この連結する単語数を多くしていくと、単語1などがテーブルに存在していても検索結果が0件になってしまいます。
> > > mecab辞書で試した場合は、
> > >   1000単語のOR:12件ヒット
> > >   5000単語のOR:0件
> > >   10000単語のOR:0件
> > >
> > > という結果でした。
> > > 文字列長に制限があるのかと思い、以下のように試してみたところ
> > >
> > >   mysql> SELECT count(*) FROM table_name WHERE MATCH(column_name)
> > > AGAINST('*DOR 単語1 単語2 ランダム値 ランダム値 ... 略 ' in boolean mode);
> > >
> > > こちらは10000単語(文字列長は先ほどより長め)でも正常にヒットしました。
> > >
> > > ご存知の方いらっしゃいましたらご教授願えませんでしょうか。どうぞよろしくお願い致します。
> > >
> > > ■動作環境
> > >   Linux kernel 2.4.20
> > >   mysql-4.1.22
> > >   senna-1.0.4
> > >   tritonn-1.0.2.mysql-4.1.22.senna-1.0.4
> > >   テーブルはNGRAMで作成
> > >
> > > --
> > > ishi.yukio [at] gmail.com
> > ---
> > Tasuku SUENAGA <a****@razil*****>
> >
> > _______________________________________________
> > Senna-dev mailing list
> > Senna****@lists*****
> > http://lists.sourceforge.jp/mailman/listinfo/senna-dev
> >
> _______________________________________________
> Senna-dev mailing list
> Senna****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/senna-dev
> 
--
morita




Senna-dev メーリングリストの案内
アーカイブの一覧に戻る