[groonga-dev,01732] Re: grn_str_charlen_utf8のwarningメッセージの影響について

Back to archive index

Kouhei Sutou kou****@clear*****
2013年 8月 30日 (金) 11:28:02 JST


須藤です。

In <CANM+Hhc=iBUz+np28wabCrxnuH6_tiugK****@mail*****>
  "[groonga-dev,01729] Re: grn_str_charlen_utf8のwarningメッセージの影響について" on Fri, 30 Aug 2013 07:11:55 +0900,
  Naoya Murakami <visio****@gmail*****> wrote:

> 1.grn_str_charlen_utf8(): imcomplete character
> 
> このメッセージが出力されるケースが特定できました。
> ベクターカラムに対して、"区切り文字データなし"をinsertした後に、
> selectすると、うまくデータを取得できません(NULLが入るんですかね)。
> これをinsert into A select * from Bすると、このメッセージが発生します。
> 
> ベクターカラムに投入したデータに問題があったようです。
> 
> 既存のテーブルをgroup_concatしただけで、結構、
> "データ1区切り文字区切り文字データ2"となっているケースがあったので、
> 投入するデータをチェックして、区切り文字の後にデータがない状態が
> 発生しないようにしてベクターカラムに投入したいと思います。
> 
> "データ1区切り文字区切り文字データ2"をinsertとすると、
> データ2(下のケースだと"ぐるんが")が無視されますが、
> この挙動が正しいのかどうかよくわかりません。よければ、ご検討ください。

はい!
再現方法も一緒にもらえてとても助かります。動作を確認して、ど
うなるのがよいか検討します。(「データなし」を無視してもいい
かなぁという気はしています。)

> 2. grn_str_charlen_utf8(): first byte is invalid

>>例えば、以下のように不正なUTF-8文字を含んでいる場合、
>>  Hel${不正なUTF-8文字}lo World
>>「lo World」以降は無視される処理になっていることがほとんどなはずです。
> 
> このような不正文字は、おそらく文章の途中で区切られているケースはあまり
> ないと思われます。
> なので、以下のようにトークナイズしてくれていたら影響が少なくうれしいなと
> 思っています。それとも、やはり後ろに続くHello World.まで無視されてしまう
> のですかね。。
> 
> Good Bye World.${不正なUTF-8文字}Hello World.
>> Good | Bye | World | . | Hello | World | .
> 
> トークンを切り出した後に無視されるのか、それとも文章に不正文字が1つでも
> 含まれていたら、不正文字の後の全部が無視されるのかで影響度がかなり違うので、
> このあたりを知りたいなぁと思ってます。
> たとえば、数千文字の文章で先頭1文字目で不正文字がでてきたら、文章全体が
> 無視されてしまう?

はい、文書全体が無視されます。。。

> このメッセージがでる文章を特定できたら、実際のトークナイズされ方を見ることが
> できると思いますが、オフラインインデックス構築中に稀に見かける程度なので、
> どの文章でこのメッセージがでているのかを特定するのが大変なのですよね。

ですよね。

> この警告メッセージが出力される文章および不正文字の出現位置を簡単に
> 特定する方法はありますか?

groongaのloadコマンドはいい感じにログに出してくれるようにし
ていますが、mroongaの場合はしていないんですよねぇ。

> ソースを一時的に書き換えてこのメッセージをエラーにしておけば、処理がとまって
> 特定できますかね?
> それか、前に教えていただいたようにして、gdbでbreak str.c:44とかしておけば、
> ブレークしてとまってくれるのですかね?
> 
> https://github.com/groonga/groonga/blob/b6f34484726019881d2466d979cc45cd3afd2c12/lib/str.c#L44

あ、ここのエラーメッセージを

https://github.com/groonga/groonga/blob/master/lib/normalizer.c#L566

のエラーメッセージのようにすれば該当テキストが表示されていい
かもしれません。

str.cにあるこの関数とnormalizer.cにあるこの関数を一緒にした
いんですが、まだ手付かずなんですよね。。。早く整理しない
と。。。

> ---------------------------------------------
> 以下でgrn_str_charlen_utf8(): imcomplete characterを再現することができます。
> ご参考まで。

ありがとうございます!とても助かります!

-- 
須藤 功平 <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