[groonga-dev,01632] Re: mroongaログのtoo many postingsの警告メッセージの影響について

Back to archive index

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




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