[groonga-dev,02583] Groongaのハイライト関数の実装について

Back to archive index

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本体には組み込まないと
判断されていただいてもかまいません。

以上、よろしくお願いします。



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