組み込み型全文検索エンジンSenna
■ このスレッドは過去ログ倉庫に格納されています
0001うんこ船長
2005/06/15(水) 00:14:13ID:nYzPplAZhttp://dev.razil.jp/project/senna/
0140nobodyさん
2007/08/10(金) 04:03:10ID:???よって、複数のN-gramインデックスを作成する場合には、
ALTER TABLE table
ADD FULLTEXT index_name_title USING NGRAM (title),
ADD FULLTEXT index_name_body USING NGRAM (body);
のように、1つのクエリで複数のインデックスを作成しなければなりませんでした。
----
これって前からこんな仕様だったっけ?
全然気にせずインデックス張ってたよ・・・
0142nobodyさん
2007/09/21(金) 01:32:45ID:???Sennaのサイト内検索のCGIをPerlで作ってるんだが・・・
一般公開すると仮定した場合、需要はあるだろうか?
0143142
2007/09/21(金) 01:34:54ID:???0145nobodyさん
2007/09/21(金) 16:53:44ID:???一応、現在では、公開するとなればGNU GPLライセンスで公開するつもり・・・。
公開できるところまで進むかが問題だが。
現在、インデックス作成の部分は、HTMLなどなどのファイルからテキストだけを
抜く処理を書けばほぼ完成。File::Extractモジュールとか使えばいいのかな・・・?
検索処理の部分は、スキンファイルっぽい処理を書いて
スニペットの処理を書けばほぼ終わり・・・。
・・・だと思うよ。
0146nobodyさん
2007/09/21(金) 23:24:20ID:UjaDTaQF0147nobodyさん
2007/09/22(土) 00:06:35ID:???�d
SennaのPerlバインディングの資料が少なくて俺涙目www
Tie::Sennaなんかサンプルスクリプトすらエラーを起こす。
しょうがないのでモジュールのソースを見ながら作る。
一応・・・動くんだけど、どうして動くのか判らない、そんなものができつつあります。
0148nobodyさん
2007/09/22(土) 00:15:37ID:???> 一応・・・動くんだけど、どうして動くのか判らない、そんなものができつつあります。
そういうふうにReadmeに書いておけば、自然と情報が集まってくる希ガス
0149nobodyさん
2007/09/22(土) 17:04:39ID:???ってどういうこと?「検索クエリの式」は判るけど、「式の値」って何?
0150nobodyさん
2007/09/22(土) 17:33:09ID:TclPXa4ohttp://www.koders.com/python/fid8CE7DA8C27987E7393CB41EAD4B402A2741A5C1F.aspx?s=max_exprs
を見ると「検索式の最大の数」だそうだが・・・。
じゃぁ、「*D+ nana」でPerlのSenna::Index->query_execを経由してsen_query_execで検索するときに、
0だと検索に失敗し、他の数字(試した数字の例:1,2,3,10,32,50)を指定して検索すると「セグメンテーション違反です」と
怒られるのはどうして?
文字コードの問題と切り分けるべく英数字で検索しても失敗する。何故?
0151nobodyさん
2007/09/23(日) 16:01:45ID:Mbqn4OVO大体できたから
一応アップしてみた。
人柱版ということでよろしく。動作保証ナシ。でも俺の環境では動いた。
http://takatyan.info/sss/Senna_Site_Search-0.01.zip
スクリプトなどのファイルは全部UTF8でエンコードしていますから
対応エディタをお使いください・・・。
0152nobodyさん
2007/09/23(日) 23:48:13ID:???Senna::IndexのupdateメソッドにSenna::Values型のデータを渡して
インデックス作ってみたけどやっぱりダメですね・・・。
0153nobodyさん
2007/09/24(月) 23:36:00ID:???試してみた。
なんかやたらモジュール要求されるな。
Senna の他にこんだけ追加モジュール要求された。
File::Extract
Class::Data::Inheritable
File::MMagic::XS
Spreadsheet::ParseExcel
OLE::Storage_Lite
MP3::Info
CAM::PDF
RTF::Lexer
俺の環境が Perl 5.8.0 と古いせいもあるかもしれんが…
で、なんとか mksss.pl 起動までこぎつけたが
新規 1778個
更新 0個
削除 0個
と出た後
Can't call method "mime_type" on an undefined value at mksss.pl line 156.
でこける…
直前の $e->extract($key); が undef を返してるようなんだが…
0154nobodyさん
2007/09/25(火) 00:35:24ID:???>>151を作ったものです。
モジュールが大量に要る件についてはすみません・・・。俺自身も大量にインスコしました・・・。
えっとですね・・・それらはほとんどFile::Extractが必要とするものです。
File::Extractは、HTMLからテキストだけを抜き出すのに使ってます。
新規1778個っていうのはファイル数ですけど、そのくらいありますか?
そういえば・・・画像ファイルとかを除外する処理をしていませんね。
ですから画像ファイルをインデックスしようとして失敗しているのかも。
$e->extract($key)がundefを返したらスキップするのがいいかもしれません。
そもそもHTMLファイルだけの環境でしかテストしてませんでした・・・
$e->extract($key)がundefを返したらスキップするには、
$e->extract($key)
を
$e->extract($key) || return;
に直すといいかもしれません。
明日にでも画像ファイルなどが混在した状況でテストしなおしてみます・・・。
0155153
2007/09/25(火) 00:47:13ID:???ども。
検索対象にしようとしたのは某 2ch 過去ログサイトで、
新規1778個っていうのはほとんど 2ch の過去ログです。
とはいえ関係ない種類のファイルも若干混じっているので
試しに明らかに HTML しか含んでいないディレクトリ指定してやってみても
新規 67個
更新 0個
削除 0個
Can't call method "mime_type" on an undefined value at mksss.pl line 156.
てな感じでした…
この67個は全部 DAT2HTML で HTML 化した 2ch の過去ログです。
漏れももう少し探ってみます…
0156nobodyさん
2007/09/25(火) 00:54:55ID:???mksss.plの89〜92行目ぐらいの
&update($index,$constants_code{$index->encoding()},\%StorageDB,\%ModifiedDB,\%TitleDB,$_);
と
print "新規: $i / @{[$#new + 1]} $_ \n";
を入れ替えて実行すると、どのファイルが問題なのか判るかと思います。
0158153
2007/09/25(火) 02:01:50ID:???どんな HTML 食わせても File::Extract が undef 返すっぽいわ…
0159153
2007/09/25(火) 13:05:25ID:???で、やたら文字化けするから変だと思ったら、
$main::IndexConvert を 1 に変えておかないとダメなのね。
それでもやっぱりスニペットが文字化けしまくるし
その関係か日本語でほとんどヒットしない。
で、さらに調べたところ、
File::Extract::Result->text() は
元の HTML の文字コードにかかわらず UTF-8 バイト列を返すっぽい (たまに UTF-8 文字列を返すこともある) ので、
164行目の
Encode::from_to($buf,$guess, $encoding) if($main::IndexConvert); は
Encode::from_to($buf, 'utf8', $encoding) if($main::IndexConvert); にしないとダメぽ。
ほか俺が使う時にデフォルト設定から変えた部分↓
$main::Indexcode = SEN_ENC_EUCJP; (MeCab に合わせて)
$main::Indexflags = SEN_INDEX_NORMALIZE; (正規化する、N-gram 使わない)
@main::GuessCode = qw/cp932 euc-jp utf8 7bit-jis/; (shiftjis より cp932 の方が無難かな)
$main::SkinDir = 'skinfiles/'; (パッケージ展開した直後の状態に合わせて)
で、文字化け問題は大方解決したんだが、
多数ヒットするキーワードで検索すると
Out of Memory というエラーメッセージが出て結果が出ないことがある。
それから Readme にも書いてあるけど TITLE とか H1, H2 とか A とかに重み付けしたスコアリングは欲しいね。
0160nobodyさん
2007/09/25(火) 18:02:17ID:???これはこれはありがとうございます。
File::Extractはコントラクタにオプションを渡すと文字コードの変換をやってくれるらしいので、
それに任せることにして、mksss.pl自体での本文の変換はしないことにします・・・。
重み付けをやるには、前述のSenna::Valuesクラスを使ってのインデックス化と検索ができれば
Senna側としては可能です。
あとは、そのためのHTMLを解釈する部分が作れればよいのですが・・・。
File::Extractじゃ無理っぽいね。自前で書くしかないかなぁ。
0161nobodyさん
2007/09/30(日) 22:59:18ID:7soZ8WBh0162nobodyさん
2007/10/02(火) 22:03:25ID:???遅レスだけど、max_exprsはクエリで列挙できるキーワードの数の最大値ってことだよ。例えば、
"+ああん -いやん +ばかん -うふん"
だと4つのキーワードがそれぞれの演算子と共に評価されるけど、max_exprsを超える数については無視される。
Tritonnだとmax_exprs=32固定なので、一度に指定できるのは32個までという仕様になってる。
0163nobodyさん
2007/10/20(土) 03:01:54ID:???お金出してでも導入する。
今のように難しくて面倒くさいうちは、LIKE%%検索で乗り切る。
0164nobodyさん
2007/10/21(日) 09:18:15ID:???全文検索入れるか、まったく入れないかの選択になる
ってか、mysqlのバージョンが進めば、標準でマルチバイトの全文検索に対応するかな?
0165nobodyさん
2007/10/21(日) 20:02:03ID:???Ludia 使ってる香具師おらんの?
0166nobodyさん
2007/11/14(水) 10:26:02ID:???大分前にソースからパッチ当てて入れた時にはかなり大変だったけど
ありがたいねえ�d�d
0167nobodyさん
2007/11/22(木) 13:00:07ID:t/zyhRCZ辞書をEUC-JPとして再構成したいのですが
/usr/libexec/mecab/mecab-dict-index -d /usr/lib/mecab/dic/ipadic/ -f utf-8 -o /usr/lib/mecab/dic/ipadic1/ -c euc-jp
とすると
/usr/lib/mecab/dic/ipadic/char.def is not found. minimum setting is used
/usr/lib/mecab/dic/ipadic/unk.def is not found. minimum setting is used.
/usr/lib/mecab/dic/ipadic/unk.def is not found. minimum setting is used.
reading /usr/lib/mecab/dic/ipadic/unk.def ... 2
emitting double-array: 100% |###########################################|
dictionary_compiler.cpp(117) [dic.size()] no dictionaries are specified
と言われてしまいます。
ipadic1の中を見ると
char.bin unk.dic
だけしかありません。
どうすればうまく辞書の再構成ができますか?
0168nobodyさん
2007/11/23(金) 12:42:00ID:???そうだよそうだよソースだよ!
MySQLが標準で日本語の全文検索に対応してくれりゃいいんだよね。
どこかの会社が全文検索を初めから使えるようにしたバージョン発売しないかな。
0169 ◆e5sgKA2q7.
2007/12/02(日) 20:38:21ID:h6hdy91g住商情報システムが売ってるんじゃないの?
0170nobodyさん
2007/12/02(日) 21:19:21ID:???をなんとかこしらえた者ですが・・・
試行錯誤の果て、Perlバインディングによる実現は挫折しました。
結局私はMySQLバインディング Tritonnに逃げました。
というか・・・
>>151はインデックスの更新のために文書データを丸ごとBerkeleyDBに保存しておくので
実は、MySQLなりでDB作って検索するのと本質的に変わらないということに気付きました。
そんなわけでMySQL+tritonnでやるのなら、マトモに動くのが書けそうです・・・な。
0171nobodyさん
2008/01/25(金) 12:13:30ID:???もちろん無償バージョンでも。
0172nobodyさん
2008/02/08(金) 17:53:36ID:???買ったはいいがPerlから乗り換える気も起きずしまいこんでいた、Rubyの入門書を
引っ張り出してきてRubyバインディングを触ってみたらこれが
簡単に動く。
あのPerlバインディングどうなってるの・・・。
0174nobodyさん
2008/03/03(月) 04:05:35ID:KobAduJVphpでmysqliを使えるようにするために必要みたいなのですが・・・
0175nobodyさん
2008/03/03(月) 17:40:25ID:???0176nobodyさん
2008/03/04(火) 01:26:37ID:???それはまずいんじゃ…?
mysql_config って私の認識では MySQL のインストール情報を
記録しておく (いつでも表示できるような) ミニアプリなので、
手順を踏んでインストールしないと意味がないもののような気がする。
パッケージ管理システムを採用しているような Linux ディストリビューションなら、
mysql-devel とか mysql-dev みたいな名前のパッケージを導入するのがいいのではないかな。
0178nobodyさん
2008/03/04(火) 18:06:39ID:???-configもそのひとつだったとおもう
specを調整しないといけなかったような
0179nobodyさん
2008/03/26(水) 23:50:01ID:???これをSennaで検索できるようにしたい。
インデックスを作るだけなら単に解凍してインデックスすればいいから
いいけど、
問題はスニペット。
検索結果を20件ずつ分けて表示するとしても、
検索結果を表示するたびに20個のgz圧縮datを解凍して
スニペットを作るというのは解凍が無駄なような気がする。
どうしたものか・・・。
スニペットを消すというのも手と言えば手だが思考停止に他ならないような気がする。
そうすると、解凍したdatをキャッシュするとかですかね・・・。
ちなみに現在の格納数は2818個です。
この2818個が196052KB(圧縮したサイズ)、
今後70GB程度まで格納を続けるつもりです。
196052KBの70GBに占める割合は0.2%ぐらいです。
0180nobodyさん
2008/03/28(金) 23:39:28ID:???ポスグレの場合は、大きいレコードは勝手に圧縮されるはずだから、
容量もあまり食わないし、キャッシュとかもしてくれると思う。
MySQLもそうなんじゃない?知らないけど。
0181nobodyさん
2008/03/30(日) 23:18:18ID:???レスありがとうございます。
データベースですか・・・
一応MySQLを使っていますがまだ勉強途中で圧縮されるかどうかは知らないです。
解凍したものをキャッシュするとすればそれが最適ですかね・・・
判りました、ありがとうございました。
0182nobodyさん
2008/03/31(月) 03:05:19ID:???0183nobodyさん
2008/04/07(月) 18:43:10ID:ubFKDoY/config-charset = EUC-JP
ってなってるんですが、これ間違いですか?
トリトンに組み込んでる辞書はUTF-8にしてるはずですよね?
EUC-JPへの辞書コンバートがどうもうまくいかず
調べているうちに見つけました
これが原因なのかどうかはまだ分かりませんが
0184nobodyさん
2008/04/07(月) 23:43:42ID:???コンバートしてもdirrcは書き換わらないので
そのままになってるみたいですね
0185nobodyさん
2008/08/08(金) 01:06:56ID:???0186nobodyさん
2008/09/02(火) 03:21:09ID:CDQGh37Sソースからいれないと駄目なのかな?
TritonnのLinux x86(non RPM packages)を使っています
0188730=732
2008/09/12(金) 16:44:25ID:???から誘導されてきました。
■環境
CentOS release 5.2 (Final) + Apache/2.2.3 + PHP 5.1.6 + Mediawiki v1.13.1 + Tritonn組み込みMySQL(http://qwik.jp/tritonn/) on MW ware version 5.0.0 (メモリ256MB)
Tritonn組み込みMySQL = mecab + tritonn + senna +MySQL
■問題
Mediawikiの検索窓から、例えば検索キー「を膜上に」で検索すると、msqldが潰れます。
傾向としては、助詞を前に付けて検索を行うと、検索が終わらなくなるようです(例外はあった)。
×:「を膜上に」「と化学物質の」「と化学物質」「に毛細血管」
○:「を膜上」「膜上に」「化学物質」「化学物質の」「毛細血管」「毛細血管の」
同じようなトラブルにあった方いませんか?対応はどうしました?
■Backtrace
シェル上にはBacktraceが延々と
*** glibc detected *** /usr/sbin/mysqld: double free or corruption (out): 0x091c1018 ***
======= Backtrace: =========
/lib/libc.so.6[0x6a9b16]
/lib/libc.so.6(cfree+0x90)[0x6ad070]
/usr/lib/libsenna.so.0(sen_free+0x1d)[0x236409] 以下略
■mysqlの遺言。最後に投げたクエリー
SELECT /* Medicine */ page_id, page_namespace, page_title FROM `medntpage`,`medntsearchindex`
WHERE page_id=si_page AND MATCH(si_title) AGAINST('+ U8e381ab U8e6af9bU8e7b4b0U8e8a180U8e7aea1 ' IN BOOLEAN MODE) AND page_is_redirect=0 AND page_namespace IN (0) LIMIT 20
↑あわわ「medntsearchindex」か
0189730=732
2008/09/12(金) 16:51:46ID:???↓
正:VMware workstation version 5.0.0
0190nobodyさん
2008/09/12(金) 17:56:34ID:???コア吐いてプロセスが死んじゃうの?
0191nobodyさん
2008/09/12(金) 23:54:54ID:???/sbin/service mysql restart とか打つと、延々反応無し。 kill -9 して再起動させないと駄目。
止まっちゃうような検索キー「と化学物質」を投げた直後にシェルには、これコアダンプって言うんでしょうか?
メモリダンプしてるから多分そうなんでしょうね。
他の環境で再現されなければ、インストール方法とか環境の問題で片付けるしかなさそう。
ちなみにMediawikiにぶち込んだデータは3万件です。
どなたか、ヒントを頂ければ幸いです。とりあえず、環境を変えて再現性を取る予定。
*** glibc detected *** /usr/sbin/mysqld: double free or corruption (out): 0x091c1018 ***
======= Backtrace: =========
/lib/libc.so.6[0x6a9b16]
/lib/libc.so.6(cfree+0x90)[0x6ad070]
/usr/lib/libsenna.so.0(sen_free+0x1d)[0x236409] ・・・略
======= Memory map: ========
00110000-00263000 r-xp 00000000 fd:00 565891 /usr/lib/libsenna.so.0.0.0
00263000-00264000 rwxp 00153000 fd:00 565891 /usr/lib/libsenna.so.0.0.0
0037d000-00388000 r-xp 00000000 fd:00 720898 /lib/libgcc_s-4.1.2-20080102.so.1
・・・略・・・
b7569000-b756a000 ---p b7569000 00:00 0
b756a000-b7f6e000 rw-p b756a000 00:00 0
bfe4b000-bfe61000 rw-p bfe4b000 00:00 0 [stack]
っっっっ
0192nobodyさん
2008/09/15(月) 01:47:00ID:???さらに、phpで使うときにどこで詰まるかも↓これ読んでちょっと分かった。
http://www.akiyan.com/blog/archives/2008/09/tritonnmysqlsen.html
Tritonnの開発者の人に、CentOSですんなりインストールできないです、
と報告を上げておいたので、状況が改善するまでお待ちあれー。
0193nobodyさん
2008/10/11(土) 15:33:19ID:???INSERTとかUPDATEしようとすると反応しなくなっちゃう現象発生。
/etc/init.d/mysql restartでリスタートしようとしても反応なしでkill -9しないとダメ。
再起動したあともINSERTとUPDATEしようとすると無反応。
ぐぐったらSennaで2007年にデッドロックの問題があって修正されてるみたいだけど
Tritonnに反映されてるの?
http://lists.sourceforge.jp/mailman/archives/senna-dev/2007-September/000673.html
0194nobodyさん
2008/10/11(土) 17:14:10ID:???インデックスのロックかかってるみたいね。
mysqldを落としてmyisamchk -rをすれば直るはず。
稼動中のデッドロックの問題は反映されてるけど、
途中でお亡くなりになった場合にはロックがかかりっぱになることがある。
0195nobodyさん
2008/12/05(金) 13:31:12ID:???どのようにエスケープするべきでしょうか?
検索は下記のように行っています。
〜WHERE match (myText) AGAINST("*E-4D+ ABC" IN BOOLEAN MODE)
0198nobodyさん
2009/01/07(水) 03:26:47ID:???今年もよろしくです>Senna&Tritonn
0199nobodyさん
2009/01/09(金) 19:32:35ID:???今年はSennaの次期バージョンが出ますよー。名前も変わるお
0200nobodyさん
2009/01/09(金) 22:57:10ID:???バージョンアップ早すぎだって
0201nobodyさん
2009/02/22(日) 20:36:34ID:???0203nobodyさん
2009/02/26(木) 14:03:20ID:5H0gEPaO0204nobodyさん
2009/02/26(木) 16:05:50ID:???0205nobodyさん
2009/03/03(火) 04:25:34ID:???いける
〜WHERE match(myText) AGAINST("-いいい" IN BOOLEAN MODE)
駄目・・・
NOTのみの検索ってどうしたらいいんでしょか?
0206nobodyさん
2009/03/09(月) 06:50:41ID:???Senna dev メーリングリスト 2008年1月 保存書庫
http://lists.sourceforge.jp/mailman/archives/senna-dev/2008-January/thread.html
上記に「NOT検索のみを行うとAND検索になってしまう件について」というのがあるので
見てもらうと判るんだが、お望みのよう検索をするには
WHERE NOT match(myText) AGAINST("いいい" IN BOOLEAN MODE)
とMATCH句を否定すればよい。
加えて、「あああ」も「いいい」もどちらも含まないレコードを探したければ
WHERE NOT match(myText) AGAINST("*D+ あああ いいい" IN BOOLEAN MODE)
tritonnこれからどうなるんだろ・・・
0207205
2009/03/12(木) 03:17:36ID:???ありがとうございます 出来ました!
MLで
>クエリを発行する用途
について書かれていたのですが、
私の場合(Senna導入以前からの実装を引きずってますが)一旦
大分類・小分類・期日指定 で全文検索を用いずにある程度データを絞ります
抽出されたデータのうち95%程度が条件Aに起因するものとして、残り5%の
レアケースを調べたい場合に
-条件A
とやりたかったのです
0208nobodyさん
2009/04/30(木) 02:23:25ID:5kl3TBKxソースをmake install した後、mysql_install_dbをするといつまでたっても終わらん。
普通このコマンドってどれくらいの時間で終わるんだ?
mysql自体ソースから入れたことないからわからんのだ・・
ちなみに以下の手順でやった
*mecabをインストール
#apt-get install mecab
#apt-get install mecab-ipadic
#apt-get install libmecab-dev
+IPA辞書をUTF-8に変換
# /usr/lib/mecab/mecab-dict-index -d /usr/share/mecab/dic/ipadic -o /var/lib/mecab/dic/ipadic -f euc-jp -t utf-8 -p
#/usr/lib/mecab/mecab-dict-index -d /usr/share/mecab/dic/juman -o /var/lib/mecab/dic/juman -f euc-jp -t utf-8
Mecabで利用する辞書の切り替え
# update-alternatives --config mecab-dictionary
(続く)
0209nobodyさん
2009/04/30(木) 02:25:32ID:5kl3TBKx*Sennaをビルドする
#apt-get install build-essential
senna を解凍したフォルダで
#wget http://osdn.dl.sourceforge.jp/senna/33763/senna-1.1.4.tar.gz
#tar xvzf senna-1.1.4.tar.gz
#cd senna-1.1.4
#./configure --prefix=/usr
#make
#make install
#ldconfig (念のため)
*tritonnをビルドする
#wget http://keihanna.dl.sourceforge.jp/tritonn/36449/tritonn-1.0.12-mysql-5.0.67.tar.gz
#tar xvzf tritonn-1.0.12-mysql-5.0.67.tar.gz
#cd tritonn-1.0.12-mysql-5.0.67
# apt-get install libncurses5 libncurses5-dev
#./configure --with-senna --with-mecab
#make
#make install
#groupadd mysql
#useradd -g mysql mysql
# cd /usr/local
# cd mysql
# chown -R mysql .
# chgrp -R mysql .
# bin/mysql_install_db --user=mysql
0210nobodyさん
2009/04/30(木) 15:09:25ID:???read 0m0.594s
user 0m0.180s
sys 0m0.260s
ローカルでやってみたよ
人柱乙m9(^Д^)
0211208-209
2009/04/30(木) 15:32:26ID:A/wdozZuorz...
6時間待っても終わらなかった・・・
0212nobodyさん
2009/04/30(木) 23:12:15ID:???0213208-209
2009/05/01(金) 12:40:19ID:AyTUx5sfよくわからないubuntuイメージを使ったのがいけなかったのか?
0214nobodyさん
2009/05/29(金) 15:10:26ID:QSnA4b1nwindowsだと200件ヒットするのにwinだと10件しかヒットしないんですけど何が原因ですか?
"win" in boolean mode
や
ft_min_word_len=1
など設定して再ビルドしましたがうまくいきません。
0215nobodyさん
2009/05/29(金) 15:37:11ID:???要するに検索漏れ
0216nobodyさん
2009/05/29(金) 21:08:20ID:???漏れじゃないお!
SPLIT_ALPHA的なフラグを指定するといいです。
winのようなprefixだったら、
"*E-7 win"とかでもひっかかるかな。
ft_min_word_lenとかはSennaには全く影響がないので注意。
0217nobodyさん
2009/05/29(金) 21:09:28ID:???http://d.hatena.ne.jp/mir/20070906/p2
0218214
2009/05/31(日) 16:10:19ID:???*E−7で解決できました。
多くの回答いただき感謝します。
ps
wikipediaデータで実験してますが流石に全文検索は5分くらいかかりますねorz..
0220214
2009/06/02(火) 13:56:57ID:???メモリは2GでWikipediaデータは5Gぐらいです
まだチューニングをあまりしていないのでちょっといじって見ます
0221nobodyさん
2009/06/04(木) 03:16:39ID:???0.何秒で検索できるはず。
Wikipediaデータが5Gくらいあるなら、メモリも5Gくらいないと厳しいよー。
んで、メモリ5G積むためには、OSも64bit化しないと。
0222214
2009/06/04(木) 13:49:53ID:???ありがとうございます。
遅いのはやはりサーバスペックの問題ですね…発注してきます
度々で申し訳ないのですが、全文検索で「完全一致→非わかち書き→部分一致」の順で取り出したいのですがうまくいきません。
select title from searchindex where match(title) against('*E1,5 Google' in boolean mode) limit 10\G
*E1,5*D+などのプラグマもためしてみましたがだめでした。
show senna statusは以下のような感じです。
Table: searchindex
Key_name: si_title
Column_name: si_title
Encoding: utf8
Index_type: NGRAM
Sectionalize: OFF
Normalize: ON
Split_alpha: OFF
Split_digit: OFF
Split_symbol: OFF
Initial_n_segments: 512
Senna_keys_size: 1146887
Senna_keys_file_size: 33628160
Senna_lexicon_size: 430378
Senna_lexicon_file_size: 12656640
Senna_inv_seg_size: 136482816
Senna_inv_chunk_size: 18223104
おもに参考にしたのは以下です。
ttp://lucene.jugem.jp/?eid=158
ttp://qwik.jp/senna/query.html
0223214
2009/06/04(木) 14:37:07ID:???完全一致が1番目にこないです。
---------------------
Top_10_Google_hits
Google_マップ
Google_Earth
Google←これが1番にきてほしい
…
--------------------
0224nobodyさん
2009/06/04(木) 19:15:58ID:???それは検索スコアの問題だから難しいす。
僕が作っている実システムでは、
・タイトル完全一致のみで検索(Sennaのインデックスを使わずに、MySQLのB-Treeインデックスを作る)
・全文検索
を分けて2回クエリ投げています。
0225nobodyさん
2009/06/05(金) 12:38:21ID:???>Wikipediaデータが5Gくらいあるなら、メモリも5Gくらいないと厳しいよー。
DBを基礎から勉強し直せ
0226nobodyさん
2009/06/05(金) 13:37:37ID:???select title, match(title) against('*E1,5 Google' in boolean mode) as score
from searchindex where match(title) against('*E1,5 Google' in boolean mode)
order by score desc limit 10\G
0227214
2009/06/05(金) 14:23:35ID:???>>224さん
いろいろ調べてみましたがそのやり方しかないのかもしれません…
公式ではEプラグマで実現できそうなのですが…
>>226さん
*E数値1[,数値2]プラグマもためしたのですが公式に記載されている挙動をしていないようです。
公式の説明ではE1,5で全文一致が1つ以下なら5つスコアを下げて部分一致をとる挙動になると思うのですが完全一致も部分一致も同じスコア値になっています。
+--------------------+-------+
| page_title | score |
+--------------------+-------+
| Top_10_Google_hits | 5 |
| Google_Earth | 5 |
…
| Google | 5 |
+--------------------+-------+
また"Google"で完全一致がとれません。"Google*"でも前方一致以外がとれたり(Top_10_Google_hitsもとれる)します。
0229nobodyさん
2009/06/06(土) 00:37:56ID:???Top_10_Google_hitsは前方一致でひっかかってるよ。
_は記号扱いなので、
Top 10 Google hitsと同じような感じでひっかかります。
0230nobodyさん
2009/06/06(土) 11:26:37ID:???これって全部キャッシュにのってないと
0.何秒が5分になるような検索エンジンなのかよw
少なくともインデックスがオンメモリであれば十分速度は出るんじゃないのか?
0232nobodyさん
2009/06/06(土) 18:54:01ID:???5Gのコンテンツだと、経験上インデックスサイズがだいたい5Gになるんすよ。
というわけで、いつも目安としてコンテンツサイズ分はメモリとって、と言っています。
コンテンツがテストデータだったりして、同じ文言ばっかりだとコンテンツデータに比例してサイズ増えねっす。
インデックスを全部オンメモリに載せないと速度は出ないと思う。
インデックスファイルのうち、.lと.iはメモリに載っていてほしい。
i.cはメモリに載ってなくてOK。
スラッシング起きたら、どのエンジンでも速度でないよー。
>>231
基礎から学んでくるお!いいサイト教えて。
0233nobodyさん
2009/06/06(土) 21:56:23ID:???>インデックスを全部オンメモリに載せないと速度は出ないと思う。
>スラッシング起きたら、どのエンジンでも速度でないよー。
「最高のパフォーマンス」と「まともな速度」の区別もつかないDQNなのかよ
>>>231
>基礎から学んでくるお!いいサイト教えて。
つGoogle
0235nobodyさん
2009/06/07(日) 01:41:11ID:???インデックスは使われていると思うよ。
実際*E-7のプラグマも動いているし、Sennaまで処理が落ちているのは間違いない。
.SEN/.SEN.lは激しくランダムアクセスが走るので、
こいつらがオンメモリにないと単なるシーケンシャルスキャンより遅くなってもおかしくないな。
というわけで、>>214はMySQLのデータディレクトリにある.SEN、.SEN.lファイルの容量を計算する。
あと、http://dsas.blog.klab.org/archives/50860867.html にあるmymemcheckで、min_memory_neededを計算する。
(.SENの総容量 + .SEN.lの総容量 + mymemcheckのmin_memory_needed)が
実メモリサイズを超えていたら危険な香り。
0236nobodyさん
2009/06/08(月) 05:55:39ID:???>こいつらがオンメモリにないと単なるシーケンシャルスキャンより遅くなってもおかしくないな。
オンメモリでないとシーケンシャルより遅くなるって、そんなのインデックスとは呼べないだろ
0237nobodyさん
2009/06/08(月) 19:39:07ID:???0238nobodyさん
2009/06/09(火) 19:32:51ID:???0239nobodyさん
2009/06/10(水) 01:58:34ID:???最高のパフォーマンス: インデックスも実データもメモリ上
まともなパフォーマンス: インデックスはメモリ上、実データはメモリ外
パフォーマンスでない: インデックスがメモリ外で、スラッシング起こしている
だろ。
B-treeインデックスもmmapにしろOSのキャッシュにしろ実メモリ上にないと遅いと思うぞ。
>>238はDBに大変詳しいようだから、>>214に何かアドバイスするといいのでは?
■ このスレッドは過去ログ倉庫に格納されています