Kouhei Sutou
kou****@clear*****
2013年 8月 15日 (木) 16:55:06 JST
須藤です。 In <CANM+****@mail*****> "[groonga-dev,01621] Re: mroongaログのtoo many postingsの警告メッセージの影響について" on Tue, 13 Aug 2013 18:00:49 +0900, Naoya Murakami <visio****@gmail*****> wrote: > 度々の質問へのご回答ありがとうございます。 いえいえ! ユーザー視点でのいろんな意見を聞けてこちらも助かっています。 > 1.トークンの位置情報が捨てられた場合の影響について > >>検討してみますが、それにあたってユースケースを教えてもらえな >>いでしょうか?トークンの位置情報が捨てられたときに問題になる >>のは、文書の後半にある内容をフレーズ検索したいときだけじゃな >>いかと思っています。 > > カンマとかの単語を構成し得ないトークンであればフレーズ検索にしか > 影響ないですが、かなり大きいサイズの日本語文書をバイグラムし、 > 後半のバイグラムトークンが抜けおちると、 > 後半部分のバイグラムトークンで構成され、且つ、文章中の後半にしか > でてこない単語が検索できないケースがでてくると思われます。 > > たとえば、「アイス」という単語を検索したい場合を考えると、 > 文章の前半部分に、イスが131071回出現し、且つ、 > この間、アイスが1回も出現せず、その後、文章の後半部分に > 「アイス食いたい。」という文書がでてきた場合、「イス」が捨てられて > この文章の部分のトークンは、「アイ」、「ス食」、「食い」になると > 思われます。 > この場合、「アイス」の単語を検索すると、検索トークンは、 > 「アイ」、「イス」になり、文章中に一回も出現せず一致しない > んじゃないかなぁと考えました。 > > mecabや空白区切りでトークナイズすれば、たいして問題にならないかも > しれませんが、バイグラムでトークナイズするの場合は、単語を構成しうる > 部分が喪失することになるので、ありえない話じゃないんじゃないかなぁと > 考えました。 あぁ、なるほど! たしかにそうですね。 > 2.インデックスされたトークンの出現回数の抽出について > > 実際に、カンマのほかにどういうトークンが捨てられるのかなぁと確認しようと、 > rroongaのdump_indexでトークンの出現回数を調べようと思いましたが、 > rubyの環境構築および利用に相当なれてなくて、ruby-1.93では、以下のチュートリアル > にある、$KCODEが無視されてdumpできず、1.8,2.0系では、それ以外の部分で > エラーになり諦めました。 > http://ranguba.org/rroonga/ja/file.tutorial.html > > irb --simple-prompt -rubygems -rgroonga >>> $KCODE = "UTF-8" > (irb):1: warning: variable $KCODE is no longer effective; ignored >>> > Groonga::Database.open("/var/lib/mysql/mrn_storage.mrn").dump_index("dumplist") > ArgumentError: invalid byte sequence in UTF-8 むむ。 動くようにしたいので、mroongaでのスキーマ定義と、もし外に出 せるのであればこの問題が再現するデータをもらえないでしょうか? > Q.トークンの種別は、groongaのテーブルを覗けば見れますが、出現回数までは、 > rroongaのGroonga::dump_indexでindexをダンプするか同じことをAPIで > つくらないとできないという認識でよろしいでしょうか? > http://ranguba.org/rroonga/ja/Groonga/Database.html#dump_index-instance_method はい。具体的にはこんなかんじになります。index_column_nameは 実際のものに変えてください。↓はトークン順に出力されますが、 出現回数順で出力したほうがうれしいかもなぁと思いました。 require "groonga" database_path = "/var/lib/mysql/mrn_storage.mrn" Groonga::Database.open(database_path) index_column_name = "TableNames.index_name" index = Groonga[index_column_name] index.table.open_cursor do |table_cursor| index.open_cursor(table_cursor) do |cursor| current_term_id = nil postings = [] cursor.each do |posting| current_term_id ||= posting.term_id if current_term_id == posting.term_id postings << posting else puts "<#{posting.term.key}>: #{postings.size}" current_term_id = posting.term_id postings.clear postings << posting end end unless postings.empty? puts "<#{posting.term.key}>: #{postings.size}" end end end > ログレベルの抽出は教えていただいた内容等で抽出して、監視できるようにしたいと思いますが、 > ignore too long tokenと同様に、位置情報が捨てられるトークンが、warningメッセージで > わかるとわかりやすいかもしれません。 あぁ、そういうことですか! ログメッセージの中にトークンそのものも出力してよ、ということ ですね。理解しました。warningメッセージとしてログに出力して よ、ということかと思って、それならもうすでに出しているはずな のに。。。と思っていました。 > 3.補足 > > もちろん、有償のサポート契約を結んでいるわけでもなく、そこまでいろいろと細やかな > 対応をお願いできないので、これらは、そうだったらいいなという願望なだけです。 実は、有償のサポート契約のお問い合わせがあったときは、もし、 公開できる情報でのやりとりで十分ならこのメーリングリストでの やりとりでいかがですか?と最初に提案しています。公開でのやり とりが増えればそれだけgroonga関連の情報が広まり多くの人に有 益になります。それがgroonga普及にもつながればgroonga開発チー ムとしてもうれしいことなので、そうしています。 なので、もし、このメーリングリストでのやりとりで十分であれば、 活用して、できれば、groongaの普及に協力してもらえればgroonga 開発チームとしてはうれしいです。 :-) > これは、こちらの勝手な事情なので、聞きながしていただいてかまいませんが、 > 実は、今のテーブル構成では、フルテキストインデックスのみで、AND検索が > できるように、カラムの最後に本文と区別されうる形式(ユニークなタグで囲んで) > で多数の書誌情報等を追加しています。 > この書誌情報のバイグラムトークンが捨てられる可能性があるというのは痛いなぁ > と思ってます。 > > 巨大なテーブルでできるだけ速度をだせるように、あとで思いついたので、 > 今は、書誌情報が最後にいますが、書誌情報のカラムを先頭に移すことで、 > トークンが捨てられる不安からは解消できますので、どうしても、対応が難しい > ようでしたら、こちらでテーブルを再構成します! なるほど、であれば、別カラムにしてマルチカラムインデックスに した方がよい気がします。マルチカラムインデックスにすると内部 的にはカラム毎にインデックス内の別の「セクション」というのに 入ることになります。postingsの制限はセクション毎になっている ので、別のカラムにすれば書誌情報の値はちゃんと検索できます。 こんな風にするイメージです。 CREATE TABLE x ( content TEXT, bibliographic TEXT, FULLTEXT INDEX (content, bibliographic) ) ENGINE=mroonga; INSERT INTO x VALUES ("xxx xxx ...", "<書誌情報1> <書誌情報2> ..."); SELECT * FROM x WHERE MATCH (content, bibliographic) AGAINST ("xxx <書誌情報2>" IN BOOLEAN MODE); -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270) groongaサポート: http://groonga.org/ja/support/ パッチ採用はじめました: http://www.clear-code.com/recruitment/ コミットへのコメントサービスはじめました: http://www.clear-code.com/services/commit-comment.html