Naoya Murakami
visio****@gmail*****
2014年 8月 8日 (金) 07:24:06 JST
村上です。 以前、以下のメールで、本文全体をハイライトさせるためにスニペットのタグ上限 について、相談させていただいたところ、RroongaのPatriciaTrie#tag_keys相当 の機能を提供するとよいということを教えていただきました。 http://sourceforge.jp/projects/groonga/lists/archive/dev/2014-May/002345.html パッチ箇所の軽減のため、Groongaのハイライト関数を実装してみました。 https://github.com/naoa/groonga-function-highlight/blob/master/functions/highlight.c とりあえず動きはするのですが、仕様がいまいちイケていない気がしていて、 Groonga本体にgrn_pat_tag_keysのAPI化とhighlight_html関数のプル リクエストをしようか悩んでいます。 highlight_htmlでは、Rroongaやsnippet_htmlを習うとタグのヒット上限値1024個 で、タグは1個、ノーマライザーは、NormalizerAuto決めうちになるのかなと 思います。 http://ranguba.org/rroonga/en/Groonga/PatriciaTrie.html#scan-instance_method https://github.com/groonga/groonga/blob/master/lib/proc.c#L3996-L3997 ただ、私の用途としては、 タグのヒット上限値(max_hits)を設定できること(もしくはかなり多いこと)と、 ノーマライザーが指定できること、 キーワード別にタグが設定できること、 が必須になります。 それを実現しようとすると、以下のような引数仕様になりました。 grn_rc grn_pat_tag_keys(grn_ctx *ctx, const char *string, unsigned int string_length, grn_obj *keywords, unsigned int max_hits, const char **open_tags, unsigned int *open_tag_lens, const char **close_tags, unsigned int *close_tag_lens, unsigned int n_tags, grn_obj *result) <質問> ・snippetでは、grn_snip_execをしてmax_tagged_lengthを取得してから、 バッファを確保し、grn_snip_get_resultしていると思います。 https://github.com/groonga/groonga/blob/master/lib/proc.c#L3961 当方が実装してみた上記のgrn_pat_tag_keysではgrn_pat_scanとresult の書き込みを同時にやっているので、正確なバッファ長を事前に把握する ことができません。 https://github.com/naoa/groonga-function-highlight/blob/master/functions/highlight.c#L135 ハイライトでもsnippetと同様に、APIをexecとget_resultを分けてやって、 正確なバッファ長でgrn_bulk_spaceする必要がありますか? (そもそもGRN_TEXT_INITすれば、明示的なバッファ確保は不要? grn_bulk_spaceをやっているのはmallocを効率良くやるため?) ・上記のAPIとhighlight_htmlをGroonga本体に組み込んでもいいでしょうか? (私が必要なのは、highlight_fullですが。。) ・grn_pat_tag_keysをAPIとしてGroonga本体に実装するならどこに実装 しますか?pat.cですか? なお、当方のやりたいことはプラグインで実現できており、パッチからは逃れ られますので、メンテナンス性等からGroonga本体には組み込まないと 判断されていただいてもかまいません。 以上、よろしくお願いします。