[groonga-dev,02072] Re: 複数の検索クエリがある場合のスニペットの取得対象について<Groonga>

Back to archive index

Naoya Murakami visio****@gmail*****
2014年 1月 24日 (金) 13:54:59 JST


お世話になっております。村上です。

>実装してから連絡しようと思っていたのですが、なかなか実装して
>いる時間がとれなかったので連絡します。

お忙しい中、ご連絡ありがとうございます。

>> なるほど、これができたらアプリケーション側でハンドリングできますね!
>> 見てみたら、Mroongaのudfの方は、こういう実装になっているんですね。

>はい、そうです。
>ただ、↑は引数が多くて使い勝手がよくないので、通常はあんまり
>おすすめできないAPIだなぁと思っています。

私の用途では大丈夫ですが、たしかに、引数が多すぎて、Groonga、Mroongaでは、
こんな機能もあるのか、と思って、気楽には手を出しづらい感じがしますね。。

>Mroongaで実装してあるのは、Tritonnとの互換性のためです。
>Tritonnでは↑のようなAPIで提供していたので、「まずは」同じも
>のを提供しています。今後、もっと使い勝手がよいものを提供した
>いなぁとは思っています。

現状のMroongaの仕様は、Tritonn互換のものだったのですね。
Mroongaの方もsnippet_htmlみたいに簡単なものがあると
いいかもですね!

>はい、それでよいと思います。
>
>ノーマライザー名がわかっていれば、
>
>  normalizer = grn_ctx_get(ctx,
>                           GRN_TEXT_VALUE(normalizer_name),
>                           GRN_TEXT_LEN(normalizer_name));
>
>でノーマライザーオブジェクトを取得できます。
>Mroongaの場合はMySQLの構文の制限があるので、引数をずらずら並
>べるのでよいと思っているのですが、GroongaはJavaScriptチック
>な構文を採用しているので、
>
>  snippet_full(text, {"option1": XXX, "option2": YYY, ...},
>               KEYWORD1, KEYWORD1_OPEN_TAG, KEYWORD1_CLOSE_TAG,
>               KEYWORD2, KEYWORD2_OPEN_TAG, KEYWORD2_CLOSE_TAG,
>               ...)
>
>みたいな使い勝手がいいんじゃないかと思っています。
>
>で!そうすると、{"option1": XXX, "option2": YYY, ...}をパー
>スしたら内部的にgrn_hashにする機能をいれないといけなくて、、、
>みたいなところが現状です。。。

なるほど!いいかもしれませんね!
いろいろ検討事項があるんですねぇ。。気長に期待してます!

結構いろいろ検討事項があるみたいですし、暫定的なものはsnippet_fullという
名前をやめて(かぶってあとで修正しないといけなくなりそうなので)、
Tritonnライクなスニペット関数snippet_tritonnという名前のプラグインにしてみました。

https://github.com/naoa/groonga-function-snippet_tritonn

以前、トークナイザプラグインのサンプル作ってくれてたので、簡単にプラグイン化出来ました。
当面は、こいつでアプリケーション側を対応します。

>grn_snip_set_normalizer()は実装しました。
>あわせて、grn_expr_snip_add_conditions()というのも追加してい
>ます。
>
>grn_expr_snip()を使うと、grn_snipオブジェクトを作ってしまう
>ので、ノーマライザーを変更するタイミングがなくなります。なの
>で、grn_snip_open()した後に、grn_exprからキーワードを抽出で
>きるようにしました。それが、grn_expr_snip_add_conditions()
>です。これで、grn_exprからキーワードを抽出するときでもノーマ
>ライザーを変更できます。

迅速な対応ありがごとうございます!
勝手な要望に対応いただき、大変助かります。

これ、試してみたのですが、プラグインで追加したノーマライザ
(groonga-normalizer-mysql等)だとうまく動かなくて困っています。

たとえば、NormalizerMySQLUnicodeCIだと、実行はできるのですが、
うまくスニペットが取得できません。
以下の例では、「MySQL」を「mysql」で検索しているのですが、
検索にはヒットするものの、スニペットは取得できません。

https://github.com/naoa/groonga-function-snippet_tritonn/blob/master/test/suite/normalizer_unicode_ci.actual

また、NormalizerMySQLUnicodeCIExceptKanaCIKanaWithVoicedSoundMarkだと、
grn_snip_execの中でクラッシュしてしまいます。

grn_snip_set_normalizerでnormalizerになにがしかのポインタが帰ってきて
いるようなのですが、ちょっといまのところ原因が判っていません。

https://github.com/naoa/groonga-function-snippet_tritonn/blob/master/test/suite/normalizer_unicode_ci_except.actual

リリース前でお忙しいかと思うのでお手すきのタイミングで
構わないのでご助言いただけると助かります。

>> 欲を言えば、スニペットがスカった場合、先頭のスニペットを取ってくれるような
>> オプションがあれば、うれしいなとか思ったりします。

>そこまでスニペット関数の中に入れるのは出すぎている感じがしま
>す。

確かにそうですね。

>そうではなく、snippet_html()は、何もスニペットがなかったとき
>はnullを返すようにして(今は空の配列を返している)
>
>  snippet_html(...) || "フォールバック時の値"
>
>と書けるようにするのがいいと思いました。

>こう書けるなら何もスニペットがないときはユーザーが制御できま
>す。

これができたらすごいいいですね!ゆるりと期待しております!

なんか期待してますって文言を書きすぎた気がしますが、今月のリリースも期待してます!
(2/9もリリースがあるんなら大変そうですね。。)

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



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